diff --git a/css/ChatHistory.scss b/css/ChatHistory.scss index edfdb13..4159f91 100644 --- a/css/ChatHistory.scss +++ b/css/ChatHistory.scss @@ -4,7 +4,7 @@ display: flex; flex-grow: 1; flex-direction: column; - padding: 1rem; + padding: 0.5rem; max-width: 1024px; width: 100%; /* Full width of its parent */ overflow-y: auto; /* Enable vertical scrolling */ @@ -27,9 +27,26 @@ /* Styling for user messages */ .user-chat-message { @extend %font-weight-bolder; + + .system-icon { + display: none; + } } /* Styling for system messages */ .assistant-chat-message { margin-bottom: 0.5rem; + + .you-icon { + display: none; + } +} + +.chat-message-menu { + @extend %box-shadow; + + position: absolute; + padding: 0.5rem; + background: var(--bg-color); + z-index: 300; } diff --git a/css/Hoverable.scss b/css/Hoverable.scss index 245d5e8..929e947 100644 --- a/css/Hoverable.scss +++ b/css/Hoverable.scss @@ -1,9 +1,11 @@ .hoverable { visibility: collapse; + transition: visibility 0s; /* Add a transition for smooth animation */ } .hover { .hoverable { visibility: visible; + transition: visibility 0.7s ease-in-out; /* Add a transition for smooth animation */ } } diff --git a/css/UINotification.scss b/css/UINotification.scss index 76577f7..9ab4fbb 100644 --- a/css/UINotification.scss +++ b/css/UINotification.scss @@ -2,9 +2,9 @@ position: fixed; top: 0; left: 0; - color: var(--bg-color); width: calc(100vw - 2rem); z-index: 30000; + color: var(--text-color); background-color: var(--bg-color); padding: 1rem; margin: 1rem; diff --git a/css/grid.scss b/css/grid.scss index 82e88e4..c88e55c 100644 --- a/css/grid.scss +++ b/css/grid.scss @@ -20,3 +20,7 @@ .justify-left { justify-content: left; } + +.height-100 { + height: 100%; +} diff --git a/css/icons.scss b/css/icons.scss index f2e2565..b5cd4bc 100644 --- a/css/icons.scss +++ b/css/icons.scss @@ -15,12 +15,33 @@ svg { vertical-align: middle; } +.user-icon { + margin: 0.25rem 0.75rem 0 0; + width: 2.5rem; /* Adjust the size as needed */ + height: 2.5rem; /* Should be equal to the width for a perfect circle */ + border-radius: 50%; /* This makes the shape a circle */ + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; +} + +.system-icon { + color: var(--text-color); + background-color: var(--tertiary-color); +} + +.you-icon { + background-color: var(--text-color); + color: var(--bg-color); +} + .icon-export::before { content: "\1F5E8 \2B07"; /* Speech Bubble and Downward Arrow */ } .icon-flag::before { /* Triangular Flag on Post */ - content: "\26A0"; + content: "\2757"; } .icon-bad::before { diff --git a/css/list.scss b/css/list.scss index 92dddcb..062e072 100644 --- a/css/list.scss +++ b/css/list.scss @@ -38,12 +38,14 @@ ul { border-top-color: #cccccc5e; } + /* li.selected::after { position: absolute; - right: 1rem; + right: 1.5rem; padding-left: 0.5rem; - content: '\203A\00a0'; // \00a0 is a non-breaking space + content: '\203A'; // \00a0 is a non-breaking space } + */ li.hover { border-top-color: #cccccc5e; diff --git a/css/style.scss b/css/style.scss index 9f92aaa..1e92a7f 100644 --- a/css/style.scss +++ b/css/style.scss @@ -4,6 +4,14 @@ html { margin: 0; padding: 0; height: 100%; + + /* For Mozilla Firefox */ + -moz-osx-font-smoothing: grayscale; + /* Modern browsers (WebKit-based) */ + -webkit-font-smoothing: antialiased; + /* Fallback for other browsers */ + /* stylelint-disable-next-line property-no-unknown */ + font-smoothing: antialiased; } body { diff --git a/dist/index.html b/dist/index.html index d43c2f6..75dcbc3 100644 --- a/dist/index.html +++ b/dist/index.html @@ -170,24 +170,30 @@

Chat settings

diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index 44a2dd4..65393e9 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -144,13 +144,16 @@ window.onerror = function (message, source, lineno, colno, error) { */ class UINotification { - constructor(message, type) { + constructor(message, type, autoDismiss) { const id = simpleHash(JSON.stringify(message)); this.type = type; this.domId = `notification-${id}`; this.container = document.body; this.template = document.getElementById('notification-template').content; this._bindEventListeners(); + if (autoDismiss) { + this.autoDismiss(); + } } _bindEventListeners() { window.addEventListener('keydown', event => { @@ -159,9 +162,15 @@ class UINotification { } }); } + autoDismiss() { + setTimeout(() => { + this.hide(); + }, 2000); // 2000 milliseconds (2 seconds) + } static show(message, type) { const notification = new UINotification(message, type); notification.show(message); + return notification; } static initialize() { // Store the original console.error function @@ -651,10 +660,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.AppController = void 0; +var _UINotification = require("./UINotification.js"); var _Event = require("./Event.js"); var _Chat = require("./models/Chat.js"); var _ChatMessage = require("./models/ChatMessage.js"); var _Settings = require("./models/Settings.js"); +// TODO: Move all actions here? class AppController { static async updateChat(chat, data) { Object.assign(chat, data); @@ -679,6 +690,7 @@ class AppController { return chat; } static async deleteChatMessage(messageId) { + _UINotification.UINotification.show('Deleted message').autoDismiss(); const message = await _ChatMessage.ChatMessage.get(messageId); message.delete(); } @@ -716,7 +728,7 @@ class AppController { } } exports.AppController = AppController; -},{"./Event.js":"js/Event.js","./models/Chat.js":"js/models/Chat.js","./models/ChatMessage.js":"js/models/ChatMessage.js","./models/Settings.js":"js/models/Settings.js"}],"js/ChatListItem.js":[function(require,module,exports) { +},{"./UINotification.js":"js/UINotification.js","./Event.js":"js/Event.js","./models/Chat.js":"js/models/Chat.js","./models/ChatMessage.js":"js/models/ChatMessage.js","./models/Settings.js":"js/models/Settings.js"}],"js/ChatListItem.js":[function(require,module,exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1109,6 +1121,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.CopyButton = void 0; +var _UINotification = require("./UINotification.js"); class CopyButton { constructor() { document.addEventListener('click', event => { @@ -1133,13 +1146,13 @@ class CopyButton { document.body.removeChild(textarea); // Optional: Display a message or change the button text/content - alert('Text copied to clipboard'); + _UINotification.UINotification.show('Text copied to clipboard').autoDismiss(); } }); } } exports.CopyButton = CopyButton; -},{}],"js/OllamaApi.js":[function(require,module,exports) { +},{"./UINotification.js":"js/UINotification.js"}],"js/OllamaApi.js":[function(require,module,exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1768,6 +1781,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.ChatArea = void 0; +var _UINotification = require("./UINotification.js"); var _AppController = require("./AppController.js"); var _ExportChat = require("./ExportChat.js"); var _Event = require("./Event.js"); @@ -1881,17 +1895,17 @@ class ChatArea { }); copyButton.dataset['target'] = domId; flagButton.addEventListener('click', async () => { - console.log('flagged'); + _UINotification.UINotification.show('Flagged message').autoDismiss(); message.quality = 'flagged'; await message.save(); }); goodButton.addEventListener('click', async () => { - console.log('good'); + _UINotification.UINotification.show('Marked message as good').autoDismiss(); message.quality = 'good'; await message.save(); }); badButton.addEventListener('click', async () => { - console.log('bad'); + _UINotification.UINotification.show('Marked message as bad').autoDismiss(); message.quality = 'bad'; await message.save(); }); @@ -1930,7 +1944,7 @@ class ChatArea { } } exports.ChatArea = ChatArea; -},{"./AppController.js":"js/AppController.js","./ExportChat.js":"js/ExportChat.js","./Event.js":"js/Event.js","./Hoverable.js":"js/Hoverable.js","./ChatTitle.js":"js/ChatTitle.js","./ChatForm.js":"js/ChatForm.js"}],"js/App.js":[function(require,module,exports) { +},{"./UINotification.js":"js/UINotification.js","./AppController.js":"js/AppController.js","./ExportChat.js":"js/ExportChat.js","./Event.js":"js/Event.js","./Hoverable.js":"js/Hoverable.js","./ChatTitle.js":"js/ChatTitle.js","./ChatForm.js":"js/ChatForm.js"}],"js/App.js":[function(require,module,exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2157,7 +2171,7 @@ var parent = module.bundle.parent; if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { var hostname = "" || location.hostname; var protocol = location.protocol === 'https:' ? 'wss' : 'ws'; - var ws = new WebSocket(protocol + '://' + hostname + ':' + "63070" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "61420" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/script.d573be0b.js.map b/dist/script.d573be0b.js.map index 17a6daf..eb4ac3c 100644 --- a/dist/script.d573be0b.js.map +++ b/dist/script.d573be0b.js.map @@ -1 +1 @@ -{"version":3,"sources":["js/UINotification.js","js/models/Settings.js","js/Event.js","js/Dom.js","js/debounce.js","js/Database.js","js/Migrations.js","js/models/BaseModel.js","js/models/ChatMessage.js","js/models/Chat.js","js/AppController.js","js/ChatListItem.js","js/DragAndDrop.js","js/ChatList.js","js/DownloadChatsButton.js","js/models/LocalStorage.js","js/Sidebar.js","js/CopyButton.js","js/OllamaApi.js","js/DownloadButton.js","js/DropDownMenu.js","js/Modal.js","js/List.js","js/models/Models.js","js/ModelsList.js","js/SettingsDialog.js","js/ChatSettingsDialog.js","js/ExportChat.js","js/Hoverable.js","js/ChatTitle.js","js/ChatForm.js","js/ChatArea.js","js/App.js","js/script.js","../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/hmr-runtime.js"],"names":["simpleHash","str","hash","i","length","char","charCodeAt","UINotification","constructor","message","type","id","JSON","stringify","domId","container","document","body","template","getElementById","content","_bindEventListeners","window","addEventListener","event","key","hide","show","notification","initialize","originalConsoleError","console","error","_len","arguments","args","Array","_key","apply","handleApplicationError","debug","clone","cloneNode","notificationElement","querySelector","textContent","classList","add","closeButton","onclick","appendChild","remove","exports","Settings","set","value","stringValue","localStorage","setItem","e","get","defaultValue","undefined","getItem","parse","removeItem","getUrl","uri","baseUrl","URL","href","setUrl","url","getModel","setModel","model","getSystemPrompt","setSystemPrompt","systemPrompt","getModelParameters","setModelParameters","modelParameters","getCurrentChatId","setCurrentChatId","chatId","Event","listen","eventName","handler","detail","emit","data","log","CustomEvent","bubbles","dispatchEvent","DOM","showElement","element","hideElement","enableInput","removeAttribute","disableInput","setAttribute","debounce","func","wait","timeout","funcWrapper","later","clearTimeout","setTimeout","Database","dbName","objectStores","migrations","dbConnection","open","Error","Promise","resolve","reject","request","indexedDB","version","onerror","target","onupgradeneeded","db","result","transaction","currentTarget","upgrade","oldVersion","onsuccess","storeName","mode","objectStore","store","handleRequest","put","delete","getAll","clear","Migrations","database","funcName","upgradeFunc","upgradeToVersion2","context","createObjectStore","keyPath","autoIncrement","chatMessages","createIndex","unique","_Database","require","_Migrations","BaseModel","Object","assign","create","save","jsonify","name","records","map","getAllByIndexAndId","indexName","index","messages","export","_BaseModel","ChatMessage","getAllByChatId","_ChatMessage","Chat","addMessage","getMessages","chat","_Event","_Chat","_Settings","AppController","updateChat","createChat","title","deleteChatMessage","messageId","deleteChat","getCurrentChat","setCurrentChat","clearChats","_AppController","ChatListItem","chatList","selected","setTitle","bindEventListeners","render","onMouseover","bind","onMouseout","onClick","selectChat","chatTitle","DragAndDrop","selector","listItems","querySelectorAll","draggedItem","initializeDragAndDrop","forEach","item","handleDragStart","handleDragOver","handleDrop","handleDragEnd","preventDefault","currentHTML","innerHTML","_ChatListItem","_DragAndDrop","ChatList","then","handleChatCreated","handleChatDeleted","handleChatsCleared","handleChatUpdated","handleChatSelected","appendChat","elements","listElement","previousListElement","newListElement","currentChatId","chats","chatListItem","DownloadChatsButton","button","exportChat","exportChatMessages","jsonData","blob","Blob","createObjectURL","a","createElement","download","click","revokeObjectURL","errorCode","LocalStorage","_debounce","_ChatList","_DownloadChatsButton","_LocalStorage","Sidebar","settings","newChatButton","clearButton","hamburgerButton","searchButton","downloadChatsButton","searchRow","searchInput","toggleSearch","performSearch","handleNewChat","handleClear","toggle","listItem","scrollIntoView","behavior","block","inline","focus","escapeRegExp","string","replace","query","trim","queryContent","regex","RegExp","matches","filter","match","test","includes","contains","CopyButton","targetSelector","getAttribute","textToCopy","innerText","textarea","select","execCommand","removeChild","alert","OllamaApi","abortController","send","onResponse","onError","onDone","response","postChatMessage","handleResponse","AbortController","signal","fetch","method","headers","ok","status","reader","getReader","partialLine","isRequestDone","done","read","textChunk","TextDecoder","decode","lines","split","pop","line","responseData","printResponseStats","abort","total_duration","totalDurationInSeconds","loadDurationInSeconds","load_duration","promptEvalDurationInSeconds","prompt_eval_duration","responseEvalDurationInSeconds","eval_duration","tokensPerSecond","eval_count","output","created_at","toFixed","prompt_eval_count","getModels","json","models","catch","DownloadButton","targetId","downloadElementContent","elementId","filename","DropDownMenu","buttonSelector","dropDownMenus","init","menuElement","closest","dropDownMenu","toggleMenu","menu","Modal","modal","handleShow","handleHide","List","containerId","items","clickHandler","setItems","setSelected","getSelected","ul","li","_OllamaApi","Models","load","getNames","findModelByName","find","_List","_Models","ModelsList","selectedModel","modelList","handleModelsLoaded","_Modal","_UINotification","_ModelsList","SettingsDialog","showButton","urlInput","modelInput","systemPromptInput","modelParametersInput","refreshModelsButton","loadSettings","parsedValue","prettyJSON","refreshModels","ChatSettingsDialog","ExportChat","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_ExportChat","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","exportChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","copyButton","goodButton","badButton","flagButton","quality","spellcheck","dataset","textElement","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userPrompt","userMessage","systemMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App","OVERLAY_ID","OldModule","module","bundle","Module","moduleName","call","hot","hotData","_acceptCallbacks","_disposeCallbacks","accept","fn","push","dispose","checkedAssets","assetsToAccept","parent","isParcelRequire","WebSocket","hostname","protocol","ws","onmessage","handled","assets","asset","isNew","didAccept","hmrAcceptCheck","global","parcelRequire","every","generated","js","hmrApply","v","hmrAcceptRun","reload","close","onclose","removeErrorOverlay","stack","overlay","createErrorOverlay","stackTrace","getParents","modules","parents","k","d","dep","isArray","concat","Function","deps","cached","cache","some","cb"],"mappings":"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","file":"script.d573be0b.js","sourceRoot":"..","sourcesContent":["function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// Show all uncaught errors as UI notifications\n/*\nwindow.onerror = function (message, source, lineno, colno, error) {\n const errorDetails = `${message} at ${source}:${lineno}:${colno}`;\n UINotification.show(errorDetails, 'error');\n return true;\n};\n*/\n\nexport class UINotification {\n constructor(message, type) {\n const id = simpleHash(JSON.stringify(message));\n this.type = type;\n this.domId = `notification-${id}`;\n this.container = document.body;\n this.template = document.getElementById('notification-template').content;\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n static show(message, type) {\n const notification = new UINotification(message, type);\n notification.show(message);\n }\n\n static initialize() {\n // Store the original console.error function\n const originalConsoleError = console.error;\n\n // Override console.error\n console.error = function (...args) {\n UINotification.show(args);\n // Call the original console.error with all arguments\n originalConsoleError.apply(console, args);\n };\n }\n\n static handleApplicationError(error) {\n console.debug('caught error');\n console.error(error);\n UINotification.show(error);\n }\n\n show(message) {\n // Clone the template\n const clone = this.template.cloneNode(true);\n\n // Find the root element of the notification in the clone\n const notificationElement = clone.querySelector('.notification');\n if (!notificationElement) {\n console.error('Notification root element not found in template');\n return;\n }\n\n // Set the message\n clone.querySelector('.notification-message').textContent = message;\n\n notificationElement.id = this.domId; // Set ID on the actual element, not the fragment\n // Add type, for example, error\n if (this.type) {\n notificationElement.classList.add(`notification-${this.type}`);\n }\n\n // Add close functionality\n const closeButton = clone.querySelector('.close-notification-button');\n closeButton.onclick = () => this.hide();\n\n // Don't show the same notification twice\n if (!document.getElementById(this.domId)) {\n // Append to the container and display\n this.container.appendChild(clone);\n }\n }\n\n hide() {\n document.getElementById(this.domId)?.remove();\n }\n}\n","export class Settings {\n // Static method to set a value in localStorage\n static set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Static method to get a value from localStorage\n static get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Static method to remove a value from localStorage\n static remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n\n static getUrl(uri) {\n try {\n const baseUrl = Settings.get('url');\n if (uri) {\n return new URL(uri, baseUrl).href;\n } else {\n return baseUrl;\n }\n } catch (error) {\n return null;\n }\n }\n\n static setUrl(url) {\n Settings.set('url', url);\n }\n\n static getModel() {\n return Settings.get('model');\n }\n\n static setModel(model) {\n Settings.set('model', model);\n }\n\n static getSystemPrompt() {\n return Settings.get('system-prompt');\n }\n\n static setSystemPrompt(systemPrompt) {\n if (systemPrompt === '') {\n systemPrompt = null;\n }\n Settings.set('system-prompt', systemPrompt);\n }\n\n static getModelParameters() {\n return Settings.get('model-parameters');\n }\n\n static setModelParameters(modelParameters) {\n if (modelParameters === '') {\n modelParameters = null;\n }\n Settings.set('model-parameters', modelParameters);\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static setCurrentChatId(chatId) {\n if (chatId === undefined) {\n chatId = null;\n }\n Settings.set('currentChatId', chatId);\n }\n}\n","export class Event {\n static listen(eventName, handler) {\n window.addEventListener(eventName, (event) => {\n handler(event.detail);\n });\n }\n\n static emit(eventName, data) {\n let log = `${eventName}`;\n if (data?.id) {\n log += ` id: ${data.id}`;\n }\n console.log(log);\n const event = new CustomEvent(eventName, {\n detail: data || {},\n bubbles: true, // This makes the event bubble up through the DOM\n });\n window.dispatchEvent(event);\n }\n}\n","export class DOM {\n static showElement(element) {\n element.classList.remove('hidden');\n return this;\n }\n\n static hideElement(element) {\n element.classList.add('hidden');\n return this;\n }\n\n static enableInput(element) {\n element.removeAttribute('disabled');\n return this;\n }\n\n static disableInput(element) {\n element.setAttribute('disabled', 'disabled');\n return this;\n }\n}\n","export function debounce(func, wait) {\n let timeout;\n\n return function funcWrapper(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n","export class Database {\n constructor(dbName, objectStores, migrations) {\n this.dbName = dbName;\n this.objectStores = objectStores;\n this.dbConnection = null; // Initialized in open\n this.migrations = migrations;\n }\n\n async open() {\n if (this.dbConnection) {\n throw new Error('Connection already open');\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.migrations.version);\n\n request.onerror = (event) => reject(event.target.error);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n const transaction = event.currentTarget.transaction;\n this.migrations.upgrade(db, transaction, event.oldVersion);\n };\n request.onsuccess = (event) => {\n this.dbConnection = event.target.result;\n resolve(this.dbConnection);\n };\n });\n }\n\n async transaction(storeName, mode) {\n return this.dbConnection\n .transaction([storeName], mode)\n .objectStore(storeName);\n }\n\n async add(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('add', store.add(data));\n }\n\n async get(storeName, id) {\n const store = await this.transaction(storeName, 'readonly');\n return this.handleRequest('get', store.get(id));\n }\n\n async put(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('put', store.put(data));\n }\n\n async delete(storeName, id) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('delete', store.delete(id));\n }\n\n async getAll(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('getAll', store.getAll());\n }\n\n async clear(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('deleteAll', store.clear());\n }\n\n handleRequest(type, request) {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n\n request.onerror = (event) => {\n const error = `Database ${type} operation failed: ${event.target.error.message}`;\n reject(new Error(JSON.stringify(error)));\n };\n });\n }\n}\n","export class Migrations {\n static version = 2;\n static upgrade(database, transaction, oldVersion) {\n console.debug(\n `Migration needed. Old version ${oldVersion}. New version ${this.version}.`,\n );\n const funcName = `upgradeToVersion${this.version}`;\n const upgradeFunc = this[funcName];\n if (!upgradeFunc) {\n throw new Error(`Upgrade function missing for ${funcName}`);\n }\n if (this.version >= oldVersion) {\n upgradeFunc({ database, transaction });\n }\n }\n\n static upgradeToVersion2(context) {\n // Create chats\n context.database.createObjectStore('chats', {\n keyPath: 'id',\n autoIncrement: true,\n });\n // Create chat_messages\n const chatMessages = context.database.createObjectStore('chat_messages', {\n keyPath: 'id',\n autoIncrement: true,\n });\n chatMessages.createIndex('by_chat', 'chatId', { unique: false });\n }\n}\n","import { Database } from '../Database.js';\nimport { Migrations } from '../Migrations.js';\n\nexport class BaseModel {\n constructor(data) {\n Object.assign(this, data);\n }\n\n async create() {\n const key = await this.constructor.db.add(this.constructor.storeName, this);\n if (!this.id) {\n this.id = key;\n }\n return this;\n }\n\n async save() {\n return await this.constructor.db.put(this.constructor.storeName, this);\n }\n\n async delete() {\n return await this.constructor.db.delete(\n this.constructor.storeName,\n this.id,\n );\n }\n\n jsonify() {\n return JSON.stringify(this);\n }\n\n static async database(name, store) {\n this.dbName = name;\n this.storeName = store;\n this.db = new Database(name, [store], Migrations);\n await this.db.open();\n }\n\n static async transaction(mode) {\n return await this.db.transaction(this.storeName, mode);\n }\n\n async transaction(mode) {\n return await this.constructor.transaction(mode);\n }\n\n static async get(id) {\n const data = await this.db.get(this.storeName, id);\n return new this(data);\n }\n\n static async clear() {\n return await this.db.clear(this.storeName);\n }\n\n // TODO: sorting and selecting only certain attributes\n static async getAll() {\n const records = await this.db.getAll(this.storeName);\n return records.map((data) => new this(data));\n }\n\n /**\n * Retrieves all objects associated with a given ID and index.\n *\n * @param {number|string} chatId - The ID of the chat.\n * @returns {Promise} A promise that resolves to an array.\n */\n static async getAllByIndexAndId(indexName, id) {\n // Open a transaction and access the messages store\n const transaction = await this.transaction('readonly');\n\n // Use an index to find objects with the specified id\n const index = transaction.index(indexName);\n const request = index.getAll(id);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // Convert the result into instances\n const messages = request.result.map((data) => new this(data));\n resolve(messages);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n // Exports the whole store\n static async export() {\n let transaction = await this.db.transaction(this.storeName, 'readonly');\n let store = await transaction.transaction.objectStore(this.storeName);\n return store.getAll();\n }\n}\n","import { BaseModel } from './BaseModel.js';\n\nexport class ChatMessage extends BaseModel {\n static async initialize() {\n await this.database('ChatApp', 'chat_messages');\n }\n\n static async getAllByChatId(chatId) {\n return this.getAllByIndexAndId('by_chat', chatId);\n }\n}\n","import { BaseModel } from './BaseModel.js';\nimport { ChatMessage } from './ChatMessage.js';\n\nexport class Chat extends BaseModel {\n async addMessage(data) {\n data.chatId = this.id;\n return await new ChatMessage(data).create();\n }\n\n async getMessages() {\n const messages = await ChatMessage.getAllByChatId(this.id);\n this.messages = messages;\n return this.messages;\n }\n\n static async initialize() {\n await this.database('ChatApp', ['chats']);\n }\n\n static async clear() {\n await ChatMessage.clear();\n await super.clear();\n }\n\n static async get(id) {\n const chat = await super.get(id);\n\n /*\n if (chat) {\n // Fetch all messages for this chat\n const messages = await ChatMessage.getAllByChatId(id);\n chat.messages = messages;\n }\n */\n\n return chat;\n }\n\n static async delete(id) {\n // Delete the chat instance\n await super.delete(id);\n\n // Delete all associated messages\n const messages = await ChatMessage.getAllByChatId(id);\n for (const message of messages) {\n await message.delete();\n }\n }\n}\n","import { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\nimport { Settings } from './models/Settings.js';\n\nexport class AppController {\n static async updateChat(chat, data) {\n Object.assign(chat, data);\n await chat.save();\n // TODO: Move to BaseModel\n Event.emit('chatUpdated', chat);\n }\n\n static async createChat(data) {\n if (!data) {\n data = {};\n }\n if (!data.title) {\n data.title = 'Untitled';\n }\n if (!data.model) {\n data.model = Settings.getModel();\n }\n const chat = await new Chat(data).create();\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatCreated', chat);\n Event.emit('chatSelected', chat);\n return chat;\n }\n\n static async deleteChatMessage(messageId) {\n const message = await ChatMessage.get(messageId);\n message.delete();\n }\n\n static async deleteChat(chat) {\n await chat.delete();\n if (Settings.getCurrentChatId() === chat.id) {\n Settings.setCurrentChatId(null);\n }\n Event.emit('chatDeleted', chat);\n }\n\n static async getCurrentChat() {\n const chatId = this.getCurrentChatId();\n if (chatId) {\n return await Chat.get(chatId);\n }\n return null;\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static async setCurrentChat(chat) {\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatSelected', chat);\n }\n\n static async setCurrentChatId(chatId) {\n const chat = await Chat.get(chatId);\n if (chat) {\n await this.setCurrentChat(chat);\n }\n }\n\n static async clearChats() {\n Settings.setCurrentChatId(null);\n await Chat.clear();\n Event.emit('chatsCleared');\n }\n}\n","import { AppController } from './AppController.js';\n\nexport class ChatListItem {\n constructor(chat, chatList, selected) {\n this.chat = chat;\n this.chatList = chatList;\n this.content = document\n .getElementById('chat-list-item-template')\n .content.cloneNode(true);\n this.element = this.content.querySelector('.chat-list-item');\n this.element.title = this.chat.title;\n this.element.data = { id: this.chat.id };\n this.element.classList.add(`chat${this.chat.id}`);\n if (selected === true) {\n this.element.classList.add('selected');\n // this.content.querySelector('.icon-selected').classList.remove('hidden')\n }\n this.setTitle();\n this.bindEventListeners();\n }\n\n render() {}\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', this.onMouseover.bind(this));\n this.element.addEventListener('mouseout', this.onMouseout.bind(this));\n this.element.addEventListener('click', this.onClick.bind(this));\n this.element\n .querySelector('.list-item-delete')\n .addEventListener('click', this.deleteChat.bind(this));\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n\n onClick() {\n this.chatList.selectChat(this.chat.id);\n }\n\n setTitle() {\n const chatTitle = this.content.querySelector('.chat-title');\n chatTitle.textContent = this.chat.title;\n }\n\n deleteChat() {\n AppController.deleteChat(this.chat);\n this.element.remove();\n }\n}\n","export class DragAndDrop {\n constructor(selector) {\n this.listItems = document.querySelectorAll(selector);\n this.draggedItem = null;\n this.initializeDragAndDrop();\n }\n\n initializeDragAndDrop() {\n this.listItems.forEach((item) => {\n item.addEventListener('dragstart', this.handleDragStart.bind(this, item));\n item.addEventListener('dragover', this.handleDragOver.bind(this));\n item.addEventListener('drop', this.handleDrop.bind(this, item));\n item.addEventListener('dragend', this.handleDragEnd.bind(this));\n });\n }\n\n handleDragStart(item) {\n this.draggedItem = item;\n }\n\n handleDragOver(e) {\n e.preventDefault();\n }\n\n handleDrop(item) {\n if (item !== this.draggedItem) {\n let currentHTML = item.innerHTML;\n item.innerHTML = this.draggedItem.innerHTML;\n this.draggedItem.innerHTML = currentHTML;\n console.debug('dnd drop');\n }\n }\n\n handleDragEnd() {\n this.draggedItem = null;\n }\n}\n","import { Event } from './Event.js';\nimport { ChatListItem } from './ChatListItem.js';\nimport { DragAndDrop } from './DragAndDrop.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatList {\n constructor() {\n this.element = document.getElementById('chat-list');\n this.template = document.getElementById('chat-list-item-template').content;\n this.bindEventListeners();\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n });\n }\n\n bindEventListeners() {\n Event.listen('chatCreated', this.handleChatCreated.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatsCleared', this.handleChatsCleared.bind(this));\n Event.listen('chatUpdated', this.handleChatUpdated.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n async selectChat(chatId) {\n await AppController.setCurrentChatId(chatId);\n }\n\n handleChatCreated(chat) {\n this.appendChat(chat, true);\n }\n\n handleChatDeleted(chat) {\n if (this.chat?.id === chat.id) {\n this.chat = null;\n }\n this.element.querySelector(`.chat${chat.id}`)?.remove();\n }\n\n handleChatsCleared() {\n const elements = this.element.querySelectorAll('.chat-list-item');\n elements.forEach((element) => element.remove());\n }\n\n handleChatUpdated(chat) {\n const listElement = this.element.querySelector(\n `.chat${chat.id} .chat-title`,\n );\n if (listElement) {\n listElement.textContent = chat.title;\n }\n }\n\n handleChatSelected(chat) {\n if (this.chat) {\n const previousListElement = this.element.querySelector(\n `.chat${this.chat.id}`,\n );\n if (previousListElement) {\n previousListElement.classList.remove('selected');\n }\n }\n const newListElement = this.element.querySelector(`.chat${chat.id}`);\n if (newListElement) {\n newListElement.classList.add('selected');\n }\n // Remember selected chat\n this.chat = chat;\n }\n\n render() {\n const currentChatId = AppController.getCurrentChatId();\n this.element.innerHTML = '';\n Chat.getAll().then((chats) => {\n chats.forEach((chat) => {\n const selected = chat.id === currentChatId;\n this.appendChat(chat, selected);\n });\n new DragAndDrop('.chat-list-item');\n });\n }\n\n appendChat(chat, selected) {\n const chatListItem = new ChatListItem(chat, this, selected);\n this.element.appendChild(chatListItem.element);\n return chatListItem;\n }\n}\n","import { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\nexport class DownloadChatsButton {\n constructor() {\n this.button = document.querySelector('#export-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.button.addEventListener('click', () => {\n this.exportChat();\n this.exportChatMessages();\n });\n }\n\n async exportChat() {\n const request = await Chat.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chats.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n\n async exportChatMessages() {\n const request = await ChatMessage.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chat_messages.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n}\n","export class LocalStorage {\n // Set a value in localStorage\n set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Get a value from localStorage, return defaultValue if key doesn't exist\n get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Remove a value from localStorage\n remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n}\n","import { debounce } from './debounce.js';\nimport { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\nimport { ChatList } from './ChatList.js';\nimport { DownloadChatsButton } from './DownloadChatsButton.js';\nimport { LocalStorage } from './models/LocalStorage.js';\n\nexport class Sidebar {\n constructor() {\n this.settings = new LocalStorage();\n this.chatList = new ChatList();\n this.element = document.getElementById('sidebar');\n this.newChatButton = this.element.querySelector('#new-chat-button');\n this.clearButton = this.element.querySelector('#clear-button');\n this.hamburgerButton = document.getElementById('hamburger-menu');\n this.searchButton = document.getElementById('search-button');\n this.downloadChatsButton = new DownloadChatsButton();\n this.searchRow = document.getElementById('search-row');\n this.searchInput = document.getElementById('search-input');\n if (this.settings.get('sidebar-collapsed') === true) {\n this.element.classList.add('collapsed');\n }\n this.bindEventListeners();\n }\n\n render() {\n this.chatList.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n this.searchButton.addEventListener('click', this.toggleSearch.bind(this));\n this.searchInput.addEventListener(\n 'keypress',\n debounce(this.performSearch.bind(this), 50),\n );\n this.searchInput.addEventListener(\n 'keyup',\n debounce(this.performSearch.bind(this), 50),\n );\n this.newChatButton.addEventListener('click', this.handleNewChat.bind(this));\n this.clearButton.addEventListener('click', this.handleClear.bind(this));\n this.hamburgerButton.addEventListener('click', this.toggle.bind(this));\n }\n\n // TODO: Fix\n handleChatSelected = (chat) => {\n const listItem = this.element.querySelector(`chat${chat.id}`);\n if (listItem) {\n listItem.scrollIntoView({\n behavior: 'smooth',\n block: 'start', // \"start\" will bring the top of the element into view\n inline: 'nearest', // \"nearest\" will scroll to the nearest edge if partially visible\n });\n }\n };\n\n toggleSearch() {\n const searchRow = document.getElementById('search-row');\n searchRow.classList.toggle('hidden');\n this.searchInput.focus();\n }\n\n performSearch() {\n function escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // Escapes special characters\n }\n const query = escapeRegExp(this.searchInput.value.trim()).replace(\n /\\s+/g,\n '.*',\n );\n const queryContent = query.length > 2; // Nobody wants to query content based on one character?\n const regex = new RegExp(query, 'i'); // 'i' for case-insensitive matching\n console.log(`Search ${query}`);\n Chat.getAll().then((chats) => {\n const matches = chats\n .filter((chat) => {\n let match = regex.test(chat.title);\n if (queryContent) {\n match ||= regex.test(chat.content);\n }\n return match;\n })\n .map((chat) => chat.id);\n this.element.querySelectorAll('.chat-list-item').forEach((item) => {\n if (matches.includes(item.data.id)) {\n // Now matches the type\n item.classList.remove('hidden');\n } else {\n item.classList.add('hidden');\n }\n });\n });\n }\n\n toggle() {\n this.element.classList.toggle('collapsed');\n this.hamburgerButton.classList.toggle('collapsed');\n if (this.element.classList.contains('collapsed')) {\n this.settings.set('sidebar-collapsed', true);\n } else {\n this.settings.set('sidebar-collapsed', false);\n }\n }\n\n async handleNewChat() {\n await AppController.createChat();\n }\n\n async handleClear() {\n await AppController.clearChats();\n }\n}\n","export class CopyButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('copy-button')) {\n const targetSelector = event.target.getAttribute('data-target');\n if (!targetSelector) {\n console.error('The data-target attribute is not set');\n return;\n }\n const textToCopy = document.getElementById(targetSelector).innerText;\n // Create a temporary textarea element\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n document.body.appendChild(textarea);\n\n // Select the text and copy it\n textarea.select();\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(textarea);\n\n // Optional: Display a message or change the button text/content\n alert('Text copied to clipboard');\n }\n });\n }\n}\n","export class OllamaApi {\n constructor() {\n this.abortController = null;\n }\n\n async send(url, data, onResponse, onError, onDone) {\n const request = { data };\n try {\n const response = await this.postChatMessage(url, data);\n await this.handleResponse(request, response, onResponse, onDone);\n } catch (error) {\n onError(request, error);\n }\n }\n\n async postChatMessage(url, data) {\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n const response = await fetch(url, {\n signal,\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`${url} failed with status ${response.status}`);\n }\n\n return response;\n }\n\n async handleResponse(request, response, onResponse, onDone) {\n const reader = response.body.getReader();\n let partialLine = '';\n var isRequestDone = false;\n\n while (!isRequestDone) {\n const { done, value } = await reader.read();\n if (done) {\n onDone(request, response);\n isRequestDone = true;\n continue;\n }\n\n const textChunk = new TextDecoder().decode(value);\n const lines = (partialLine + textChunk).split('\\n');\n partialLine = lines.pop();\n\n lines.forEach((line) => {\n const responseData = JSON.parse(line);\n if (line.trim()) {\n // TODO: Move this line:\n this.printResponseStats(responseData);\n onResponse(request, responseData.message.content);\n }\n });\n }\n\n if (partialLine.trim()) {\n onResponse(request, partialLine);\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n printResponseStats(data) {\n if (!data.total_duration) {\n return;\n }\n // Convert nanoseconds to seconds for durations\n const totalDurationInSeconds = data.total_duration / 1e9;\n const loadDurationInSeconds = data.load_duration / 1e9;\n const promptEvalDurationInSeconds = data.prompt_eval_duration / 1e9;\n const responseEvalDurationInSeconds = data.eval_duration / 1e9;\n\n // Calculate tokens per second (token/s)\n const tokensPerSecond = data.eval_count / responseEvalDurationInSeconds;\n const output = `\nModel: ${data.model}\nCreated At: ${data.created_at}\nTotal Duration (s): ${totalDurationInSeconds.toFixed(2)}\nLoad Duration (s): ${loadDurationInSeconds.toFixed(2)}\nPrompt Evaluation Count: ${data.prompt_eval_count}\nPrompt Evaluation Duration (s): ${promptEvalDurationInSeconds.toFixed(2)}\nResponse Evaluation Count: ${data.eval_count}\nResponse Evaluation Duration (s): ${responseEvalDurationInSeconds.toFixed(2)}\nTokens Per Second: ${tokensPerSecond.toFixed(2)} token/s\n `;\n console.log(output);\n }\n\n static getModels(url, onResponse) {\n if (!url) {\n return null;\n }\n\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Unable to fetch models from ${url}`);\n }\n return response.json();\n })\n .then((data) => {\n onResponse(data.models);\n })\n .catch((error) => {\n console.debug(error);\n console.error(\n `Please ensure the server is running at: ${url}. Error code: 39847`,\n );\n onResponse([]);\n });\n }\n}\n","export class DownloadButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('download-button')) {\n // Get the index from the data-target attribute\n const targetId = event.target.getAttribute('data-target');\n this.downloadElementContent(targetId, 'chat.html');\n }\n });\n }\n\n downloadElementContent(elementId, filename) {\n // Get the element\n const element = document.getElementById(elementId);\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n // Get the contents of the element\n const content = element.innerText;\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'text/html' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class DropDownMenu {\n constructor() {\n this.buttonSelector = '.drop-down-menu';\n this.dropDownMenus = document.querySelectorAll(this.buttonSelector);\n this.init();\n }\n\n init() {\n // Add a click listener to the whole document\n document.addEventListener('click', (event) => {\n // Check if the clicked element or any of its parents has the 'drop-down-menu' class\n const menuElement = event.target.closest(this.buttonSelector);\n if (menuElement) {\n const dropDownMenu = menuElement.querySelector('.drop-down-menu-items');\n if (dropDownMenu) {\n this.toggleMenu(dropDownMenu);\n }\n }\n });\n }\n\n toggleMenu(menu) {\n menu.classList.toggle('hidden');\n menu.classList.toggle('visible');\n }\n}\n","// Modal base class\nexport class Modal {\n constructor(domId) {\n this.domId = domId;\n this.modal = document.getElementById(this.domId);\n this.closeButton = this.modal.querySelector('.button-close');\n this.closeButton.onclick = () => this.hide();\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n show() {\n this.handleShow();\n }\n\n hide() {\n this.handleHide();\n }\n\n handleShow() {\n this.modal.classList.add('show');\n }\n\n handleHide() {\n this.modal.classList.remove('show');\n }\n}\n","export class List {\n constructor(containerId, items, selected) {\n this.container = document.getElementById(containerId);\n this.items = items;\n this.selected = selected;\n this.render();\n this.clickHandler = null;\n }\n\n onClick(handler) {\n this.clickHandler = handler;\n return this; // Allow chaining\n }\n\n setItems(items) {\n this.items = items;\n this.render();\n }\n\n setSelected(selected) {\n console.debug(`Select ${selected}`);\n this.selected = selected;\n this.render();\n }\n\n getSelected() {\n return this.selected;\n }\n\n render() {\n this.container.innerHTML = ''; // Clear existing content\n const ul = document.createElement('ul');\n ul.classList.add('list');\n this.items.forEach((item) => {\n const li = document.createElement('li');\n li.classList.add('list-item');\n if (item === this.selected) {\n li.classList.add('selected');\n }\n li.textContent = item;\n li.item = item;\n li.addEventListener('click', () => {\n this.setSelected(item);\n if (this.clickHandler) {\n this.clickHandler(item);\n }\n });\n ul.appendChild(li);\n });\n this.container.appendChild(ul);\n }\n}\n","import { Event } from '../Event.js';\nimport { Settings } from './Settings.js';\nimport { OllamaApi } from '../OllamaApi.js';\n\nexport class Models {\n static models = [];\n\n static getUrl() {\n return Settings.getUrl('/api/tags');\n }\n\n static load() {\n if (!this.getUrl()) {\n return null;\n }\n return OllamaApi.getModels(this.getUrl(), (models) => {\n Models.models = models;\n Settings.set('models', Models.models);\n Event.emit('modelsLoaded', Models.models);\n });\n }\n\n static getAll() {\n return Models.models;\n }\n\n static getNames() {\n return Models.models.map((model) => model.name);\n }\n\n static findModelByName(name) {\n return Models.models.find((model) => model.name === name);\n }\n}\n","import { List } from './List.js';\nimport { Event } from './Event.js';\nimport { Models } from './models/Models.js';\n\nexport class ModelsList {\n constructor(selector, selectedModel) {\n this.modelList = new List(selector, Models.getNames(), selectedModel);\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n Event.listen('modelsLoaded', this.handleModelsLoaded.bind(this));\n }\n\n handleModelsLoaded() {\n this.modelList.setItems(Models.getNames());\n }\n\n onClick(handler) {\n this.modelList.clickHandler = handler;\n return this.modelList; // Allow chaining\n }\n\n getSelected() {\n return this.modelList.selected;\n }\n}\n","import { Modal } from './Modal.js';\nimport { UINotification } from './UINotification.js';\nimport { ModelsList } from './ModelsList.js';\nimport { Models } from './models/Models.js';\nimport { Settings } from './models/Settings.js';\n\nexport class SettingsDialog extends Modal {\n constructor() {\n super('settings-dialog');\n this.showButton = document.getElementById('settings-button');\n this.urlInput = document.getElementById('input-url');\n this.modelInput = document.getElementById('input-model');\n this.systemPromptInput = this.modal.querySelector('#input-system-prompt');\n this.modelParametersInput = this.modal.querySelector(\n '#input-model-parameters',\n );\n this.refreshModelsButton = this.modal.querySelector(\n '.refresh-models-button',\n );\n this.modelList = new ModelsList('model-list', Settings.getModel());\n this.bindEventListeners();\n this.loadSettings();\n }\n\n bindEventListeners() {\n this.urlInput.addEventListener('blur', () => {\n const value = this.urlInput.value.trim();\n Settings.setUrl(value);\n });\n this.systemPromptInput.addEventListener('blur', () => {\n Settings.setSystemPrompt(this.systemPromptInput.value.trim());\n });\n this.modelParametersInput.addEventListener('blur', () => {\n const value = this.modelParametersInput.value.trim();\n if (value === '') {\n return;\n }\n try {\n const parsedValue = JSON.parse(value);\n const prettyJSON = JSON.stringify(parsedValue, 2);\n Settings.setModelParameters(parsedValue);\n this.modelParametersInput.value = prettyJSON;\n this.modelParametersInput.classList.remove('error');\n } catch (error) {\n if (error.name === 'SyntaxError') {\n this.modelParametersInput.classList.add('error');\n } else {\n console.error(error);\n }\n }\n });\n this.modelList.onClick(() => {\n Settings.setModel(this.modelList.getSelected());\n });\n this.showButton.addEventListener('click', this.show.bind(this));\n this.refreshModelsButton.onclick = () => this.refreshModels();\n this.closeButton.onclick = () => this.hide();\n }\n\n show() {\n Models.load();\n this.handleShow();\n }\n\n refreshModels() {\n if (!Models.getUrl()) {\n UINotification.show('Please update the URL in the settings to continue.');\n } else {\n Models.load();\n }\n }\n\n loadSettings() {\n this.urlInput.value = Settings.getUrl();\n const modelParameters = Settings.getModelParameters();\n if (modelParameters) {\n this.modelParametersInput.value = JSON.stringify(modelParameters, 2);\n }\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Modal } from './Modal.js';\nimport { Models } from './models/Models.js';\nimport { ModelsList } from './ModelsList.js';\n\nexport class ChatSettingsDialog extends Modal {\n constructor() {\n super('chat-settings-dialog');\n this.showButton = document.getElementById('chat-settings-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.showButton.addEventListener('click', this.show.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n show() {\n Models.load().then(() => {\n AppController.getCurrentChat().then((chat) => {\n this.handleChatSelected(chat);\n this.handleShow();\n });\n });\n }\n\n handleChatSelected(chat) {\n this.modelList = new ModelsList('chat-model-list', chat.model);\n this.modelList.onClick(async (model) => {\n chat.model = model;\n await chat.save();\n });\n }\n}\n","export class ExportChat {\n static exportChat(chat, filename) {\n // Get the contents of the element\n const content = chat.jsonify();\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'application/json' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class Hoverable {\n constructor(element) {\n this.element = element;\n element.hoverable = this;\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', () => this.onMouseover());\n this.element.addEventListener('mouseout', () => this.onMouseout());\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n}\n","import { Event } from './Event.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatTitle {\n constructor() {\n this.defaultTitle = 'Untitled';\n this.element = document.getElementById('chat-title');\n this.bindEventListeners();\n this.render();\n }\n\n render() {\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.setTitle(chat?.title);\n });\n }\n\n setTitle(title) {\n this.element.textContent = title || this.defaultTitle;\n }\n\n focus() {\n const hasFocus = document.activeElement === this.element;\n if (!hasFocus) {\n this.element.focus();\n }\n }\n\n bindEventListeners() {\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n this.element.addEventListener('blur', this.handleSave.bind(this));\n this.element.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.element.blur();\n }\n });\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.setTitle(chat.title);\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat.id) {\n this.setTitle(this.defaultTitle);\n }\n }\n\n async handleSave() {\n let title = this.element.textContent.trim();\n if (title.length === 0) {\n title = this.defaultTitle;\n this.element.classList.add('error');\n } else {\n this.element.classList.remove('error');\n }\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.updateChat(chat, { title });\n } else {\n await AppController.createChat({ title });\n }\n }\n}\n","// TODO: Move code here from App.js\nexport class ChatForm {\n constructor() {\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n }\n}\n","import { AppController } from './AppController.js';\nimport { ExportChat } from './ExportChat.js';\nimport { Event } from './Event.js';\nimport { Hoverable } from './Hoverable.js';\nimport { ChatTitle } from './ChatTitle.js';\nimport { ChatForm } from './ChatForm.js';\n\nexport class ChatArea {\n constructor() {\n this.chatTitle = new ChatTitle();\n this.chatForm = new ChatForm();\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.editChatButton = document.getElementById('edit-chat-button');\n this.scrollToTopButton = document.getElementById('scroll-to-top-button');\n this.scrollToEndButton = document.getElementById('scroll-to-end-button');\n this.deleteChatButton = document.getElementById('delete-chat-button');\n this.exportChatButton = document.getElementById('export-chat-button');\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.render();\n });\n this.bindEventListeners();\n }\n\n render() {\n // Clear history view\n this.chatHistory.innerText = '';\n // Render chat history\n this.chat?.getMessages()?.then((messages) => {\n messages.forEach((message) => {\n this.createMessageDiv(message);\n });\n });\n this.scrollToEnd();\n this.messageInput.focus();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n this.scrollToTopButton.addEventListener(\n 'click',\n this.scrollToTop.bind(this),\n );\n this.scrollToEndButton.addEventListener(\n 'click',\n this.scrollToEnd.bind(this),\n );\n this.editChatButton.addEventListener(\n 'click',\n this.handleEditChat.bind(this),\n );\n this.deleteChatButton.addEventListener(\n 'click',\n this.handleDeleteChat.bind(this),\n );\n this.exportChatButton.addEventListener('click', () => {\n ExportChat.exportChat(this.chat, `chat-${this.chat.id}.json`);\n });\n this.currentMessage = this.chatHistory.querySelector('.selected');\n // Select chat message with arrow up and arrow down keys\n document.addEventListener('keydown', (event) => {\n let next, previous;\n\n if (event.key === 'ArrowDown') {\n next = this.currentMessage\n ? this.currentMessage.nextElementSibling\n : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage\n ? this.currentMessage.previousElementSibling\n : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\n const domId = `chat-message-${message.id}`;\n const role = message.role;\n const content = message.content;\n // Get the template and its content\n const template = document.getElementById('chat-message-template');\n const messageClone = template.content.cloneNode(true);\n // Find the div and span elements within the cloned template\n const messageDiv = messageClone.querySelector('.chat-message');\n const textSpan = messageClone.querySelector('.chat-message-text');\n const deleteButton = messageClone.querySelector(\n '.delete-chat-message-button',\n );\n const copyButton = messageClone.querySelector(\n '.copy-chat-message-button .copy-button',\n );\n const goodButton = messageClone.querySelector('.good-chat-message-button');\n const badButton = messageClone.querySelector('.bad-chat-message-button');\n const flagButton = messageClone.querySelector('.flag-chat-message-button');\n\n if (message.quality == 'bad') {\n badButton.classList.add('selected');\n } else if (message.quality == 'good') {\n goodButton.classList.add('selected');\n } else if (message.quality == 'flagged') {\n flagButton.classList.add('selected');\n }\n\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\n messageDiv.id = domId;\n textSpan.textContent = content;\n messageDiv.spellcheck = false;\n\n // Append to chatHistory and adjust scroll\n this.chatHistory.appendChild(messageDiv);\n messageDiv.dataset['id'] = message.id;\n new Hoverable(messageDiv);\n deleteButton.addEventListener('click', async () => {\n await AppController.deleteChatMessage(message.id);\n messageDiv.remove();\n });\n copyButton.dataset['target'] = domId;\n flagButton.addEventListener('click', async () => {\n console.log('flagged');\n message.quality = 'flagged';\n await message.save();\n });\n goodButton.addEventListener('click', async () => {\n console.log('good');\n message.quality = 'good';\n await message.save();\n });\n badButton.addEventListener('click', async () => {\n console.log('bad');\n message.quality = 'bad';\n await message.save();\n });\n return { element: messageDiv, textElement: textSpan };\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat?.id) {\n this.chat = null;\n } else {\n this.chat = chat;\n }\n this.render();\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.render();\n }\n\n handleEditChat() {\n this.chatTitle.focus();\n event.stopPropagation();\n }\n\n async handleDeleteChat() {\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.deleteChat(chat);\n }\n }\n\n scrollToTop() {\n this.chatHistory.scrollTop = 0;\n }\n\n scrollToEnd() {\n this.chatHistory.scrollTop = this.chatHistory.scrollHeight;\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { Settings } from './models/Settings.js';\nimport { Event } from './Event.js';\nimport { DOM } from './Dom.js';\nimport { Sidebar } from './Sidebar.js';\nimport { AppController } from './AppController.js';\nimport { CopyButton } from './CopyButton.js';\nimport { OllamaApi } from './OllamaApi.js';\nimport { DownloadButton } from './DownloadButton.js';\nimport { DropDownMenu } from './DropDownMenu.js';\nimport { SettingsDialog } from './SettingsDialog.js';\nimport { ChatSettingsDialog } from './ChatSettingsDialog.js';\n// import { MarkdownFormatter } from './MarkdownFormatter.js'\nimport { ChatArea } from './ChatArea.js';\n\n// TODO: Review and refactor\nexport class App {\n static run() {\n UINotification.initialize();\n const app = new App();\n return app;\n }\n\n constructor() {\n this.sidebar = new Sidebar();\n this.chatArea = new ChatArea();\n this.ollamaApi = new OllamaApi();\n this.settingsDialog = new SettingsDialog();\n this.chatSettingsDialog = new ChatSettingsDialog();\n this.downloadButton = new DownloadButton();\n this.copyButton = new CopyButton();\n this.dropDownMenu = new DropDownMenu();\n this.initializeElements();\n this.bindEventListeners();\n this.logInitialization();\n this.render();\n }\n\n initializeElements() {\n // this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n this.messageInput = document.getElementById('message-input');\n this.chatHistory = document.getElementById('chat-history');\n }\n\n logInitialization() {\n const msg = `~~~~\\nChat\\n~~~~\nModel: ${Settings.getModel()}\nURL: ${Settings.getUrl()}\nChat: ${Settings.getCurrentChatId()}\nParameters: ${JSON.stringify(Settings.getModelParameters())}\n`;\n console.log(msg);\n }\n\n render() {\n this.sidebar.render();\n this.chatArea.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n // this.sendButton.addEventListener('click', this.sendMessage.bind(this));\n this.abortButton.addEventListener('click', this.handleAbort.bind(this));\n this.messageInput.addEventListener(\n 'keypress',\n this.handleKeyPress.bind(this),\n );\n }\n\n handleChatSelected = (chat) => {\n window.history.pushState({}, '', `/chats/${chat.id}`);\n };\n\n handleAbort = () => {\n this.ollamaApi.abort();\n this.enableForm();\n console.log('Request aborted');\n };\n\n handleKeyPress = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n this.sendMessage();\n }\n };\n\n enableForm() {\n DOM.hideElement(this.abortButton).enableInput(this.messageInput);\n this.messageInput.focus();\n }\n\n disableForm() {\n DOM.showElement(this.abortButton).disableInput(this.messageInput);\n }\n\n // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion\n async sendMessage() {\n const userPrompt = this.messageInput.value.trim();\n // Get the current chat\n let chat = await AppController.getCurrentChat();\n const url = Settings.getUrl('/api/chat');\n if (!url) {\n UINotification.show(\n 'Please update the URL in the settings to continue. ',\n );\n return null;\n }\n if (userPrompt) {\n // Reset input\n this.messageInput.value = '';\n // Create new chat\n if (!chat) {\n chat = await AppController.createChat({\n title: 'Untitled',\n model: Settings.getModel(),\n });\n }\n // Store user message\n const userMessage = await chat.addMessage({\n role: 'user',\n content: userPrompt,\n });\n const systemMessage = await chat.addMessage({\n role: 'assistant',\n content: '',\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage(userMessage);\n // Create system message container\n const responseElement = this.createChatMessage(systemMessage);\n const requestContext = {\n chat,\n userMessage,\n systemMessage,\n responseElement,\n };\n const requestData = {\n prompt: userMessage,\n model: chat.model,\n messages: (await chat.getMessages()).map((message) => ({\n role: message.role,\n content: message.content,\n })),\n };\n // Add system prompt\n if (systemPrompt) {\n requestData.system = systemPrompt;\n }\n // Add model parameters\n if (modelParameters) {\n requestData.options = modelParameters;\n }\n // Show spinner\n responseElement.textElement.innerHTML = '
';\n // Make request\n this.ollamaApi.send(\n url,\n requestData,\n (request, response) =>\n this.handleResponse(request, response, requestContext),\n (request, error) => this.handleResponseError(request, error),\n (request, response) =>\n this.handleDone(request, response, requestContext),\n );\n }\n }\n\n createChatMessage(message) {\n return this.chatArea.createMessageDiv(message);\n }\n\n handleResponse(request, response, context) {\n const responseElement = context.responseElement;\n const sanitizedContent = this.sanitizeContent(response);\n // Remember original response\n context.systemMessage.content += sanitizedContent;\n responseElement.textElement.textContent += sanitizedContent;\n this.chatArea.scrollToEnd();\n }\n\n handleResponseError(request, error) {\n // Ignore \"Abort\" button\n if (error.name !== 'AbortError') {\n console.error(`Error: ${error.message}`);\n }\n this.chatArea.scrollToEnd();\n this.enableForm();\n }\n\n async handleDone(request, response, context) {\n const chat = context.chat;\n console.log(`Chat ${chat.id} done`);\n await context.systemMessage.save();\n this.enableForm();\n }\n\n sanitizeContent = (content) => {\n // TODO: Sanitization logic here\n return content;\n };\n\n getIdParam = () => {\n return new URL(window.location.href).pathname.split('/').pop();\n };\n}\n","import { App } from './App.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\n// TODO: refactor\nasync function initialize() {\n await Chat.initialize();\n await ChatMessage.initialize();\n}\n\ninitialize().then(() => {\n App.run();\n});\n","var OVERLAY_ID = '__parcel__error__overlay__';\n\nvar OldModule = module.bundle.Module;\n\nfunction Module(moduleName) {\n OldModule.call(this, moduleName);\n this.hot = {\n data: module.bundle.hotData,\n _acceptCallbacks: [],\n _disposeCallbacks: [],\n accept: function (fn) {\n this._acceptCallbacks.push(fn || function () {});\n },\n dispose: function (fn) {\n this._disposeCallbacks.push(fn);\n }\n };\n\n module.bundle.hotData = null;\n}\n\nmodule.bundle.Module = Module;\nvar checkedAssets, assetsToAccept;\n\nvar parent = module.bundle.parent;\nif ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {\n var hostname = process.env.HMR_HOSTNAME || location.hostname;\n var protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n var ws = new WebSocket(protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/');\n ws.onmessage = function(event) {\n checkedAssets = {};\n assetsToAccept = [];\n\n var data = JSON.parse(event.data);\n\n if (data.type === 'update') {\n var handled = false;\n data.assets.forEach(function(asset) {\n if (!asset.isNew) {\n var didAccept = hmrAcceptCheck(global.parcelRequire, asset.id);\n if (didAccept) {\n handled = true;\n }\n }\n });\n\n // Enable HMR for CSS by default.\n handled = handled || data.assets.every(function(asset) {\n return asset.type === 'css' && asset.generated.js;\n });\n\n if (handled) {\n console.clear();\n\n data.assets.forEach(function (asset) {\n hmrApply(global.parcelRequire, asset);\n });\n\n assetsToAccept.forEach(function (v) {\n hmrAcceptRun(v[0], v[1]);\n });\n } else if (location.reload) { // `location` global exists in a web worker context but lacks `.reload()` function.\n location.reload();\n }\n }\n\n if (data.type === 'reload') {\n ws.close();\n ws.onclose = function () {\n location.reload();\n }\n }\n\n if (data.type === 'error-resolved') {\n console.log('[parcel] ✨ Error resolved');\n\n removeErrorOverlay();\n }\n\n if (data.type === 'error') {\n console.error('[parcel] 🚨 ' + data.error.message + '\\n' + data.error.stack);\n\n removeErrorOverlay();\n\n var overlay = createErrorOverlay(data);\n document.body.appendChild(overlay);\n }\n };\n}\n\nfunction removeErrorOverlay() {\n var overlay = document.getElementById(OVERLAY_ID);\n if (overlay) {\n overlay.remove();\n }\n}\n\nfunction createErrorOverlay(data) {\n var overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n\n // html encode message and stack trace\n var message = document.createElement('div');\n var stackTrace = document.createElement('pre');\n message.innerText = data.error.message;\n stackTrace.innerText = data.error.stack;\n\n overlay.innerHTML = (\n '
' +\n 'ERROR' +\n '🚨' +\n '
' + message.innerHTML + '
' +\n '
' + stackTrace.innerHTML + '
' +\n '
'\n );\n\n return overlay;\n\n}\n\nfunction getParents(bundle, id) {\n var modules = bundle.modules;\n if (!modules) {\n return [];\n }\n\n var parents = [];\n var k, d, dep;\n\n for (k in modules) {\n for (d in modules[k][1]) {\n dep = modules[k][1][d];\n if (dep === id || (Array.isArray(dep) && dep[dep.length - 1] === id)) {\n parents.push(k);\n }\n }\n }\n\n if (bundle.parent) {\n parents = parents.concat(getParents(bundle.parent, id));\n }\n\n return parents;\n}\n\nfunction hmrApply(bundle, asset) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n\n if (modules[asset.id] || !bundle.parent) {\n var fn = new Function('require', 'module', 'exports', asset.generated.js);\n asset.isNew = !modules[asset.id];\n modules[asset.id] = [fn, asset.deps];\n } else if (bundle.parent) {\n hmrApply(bundle.parent, asset);\n }\n}\n\nfunction hmrAcceptCheck(bundle, id) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n\n if (!modules[id] && bundle.parent) {\n return hmrAcceptCheck(bundle.parent, id);\n }\n\n if (checkedAssets[id]) {\n return;\n }\n checkedAssets[id] = true;\n\n var cached = bundle.cache[id];\n\n assetsToAccept.push([bundle, id]);\n\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n return true;\n }\n\n return getParents(global.parcelRequire, id).some(function (id) {\n return hmrAcceptCheck(global.parcelRequire, id)\n });\n}\n\nfunction hmrAcceptRun(bundle, id) {\n var cached = bundle.cache[id];\n bundle.hotData = {};\n if (cached) {\n cached.hot.data = bundle.hotData;\n }\n\n if (cached && cached.hot && cached.hot._disposeCallbacks.length) {\n cached.hot._disposeCallbacks.forEach(function (cb) {\n cb(bundle.hotData);\n });\n }\n\n delete bundle.cache[id];\n bundle(id);\n\n cached = bundle.cache[id];\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n cached.hot._acceptCallbacks.forEach(function (cb) {\n cb();\n });\n return true;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["js/UINotification.js","js/models/Settings.js","js/Event.js","js/Dom.js","js/debounce.js","js/Database.js","js/Migrations.js","js/models/BaseModel.js","js/models/ChatMessage.js","js/models/Chat.js","js/AppController.js","js/ChatListItem.js","js/DragAndDrop.js","js/ChatList.js","js/DownloadChatsButton.js","js/models/LocalStorage.js","js/Sidebar.js","js/CopyButton.js","js/OllamaApi.js","js/DownloadButton.js","js/DropDownMenu.js","js/Modal.js","js/List.js","js/models/Models.js","js/ModelsList.js","js/SettingsDialog.js","js/ChatSettingsDialog.js","js/ExportChat.js","js/Hoverable.js","js/ChatTitle.js","js/ChatForm.js","js/ChatArea.js","js/App.js","js/script.js"],"names":["simpleHash","str","hash","i","length","char","charCodeAt","UINotification","constructor","message","type","autoDismiss","id","JSON","stringify","domId","container","document","body","template","getElementById","content","_bindEventListeners","window","addEventListener","event","key","hide","setTimeout","show","notification","initialize","originalConsoleError","console","error","_len","arguments","args","Array","_key","apply","handleApplicationError","debug","clone","cloneNode","notificationElement","querySelector","textContent","classList","add","closeButton","onclick","appendChild","remove","exports","Settings","set","value","stringValue","localStorage","setItem","e","get","defaultValue","undefined","getItem","parse","removeItem","getUrl","uri","baseUrl","URL","href","setUrl","url","getModel","setModel","model","getSystemPrompt","setSystemPrompt","systemPrompt","getModelParameters","setModelParameters","modelParameters","getCurrentChatId","setCurrentChatId","chatId","Event","listen","eventName","handler","detail","emit","data","log","CustomEvent","bubbles","dispatchEvent","DOM","showElement","element","hideElement","enableInput","removeAttribute","disableInput","setAttribute","debounce","func","wait","timeout","funcWrapper","later","clearTimeout","Database","dbName","objectStores","migrations","dbConnection","open","Error","Promise","resolve","reject","request","indexedDB","version","onerror","target","onupgradeneeded","db","result","transaction","currentTarget","upgrade","oldVersion","onsuccess","storeName","mode","objectStore","store","handleRequest","put","delete","getAll","clear","Migrations","database","funcName","upgradeFunc","upgradeToVersion2","context","createObjectStore","keyPath","autoIncrement","chatMessages","createIndex","unique","_Database","require","_Migrations","BaseModel","Object","assign","create","save","jsonify","name","records","map","getAllByIndexAndId","indexName","index","messages","export","_BaseModel","ChatMessage","getAllByChatId","_ChatMessage","Chat","addMessage","getMessages","chat","_UINotification","_Event","_Chat","_Settings","AppController","updateChat","createChat","title","deleteChatMessage","messageId","deleteChat","getCurrentChat","setCurrentChat","clearChats","_AppController","ChatListItem","chatList","selected","setTitle","bindEventListeners","render","onMouseover","bind","onMouseout","onClick","selectChat","chatTitle","DragAndDrop","selector","listItems","querySelectorAll","draggedItem","initializeDragAndDrop","forEach","item","handleDragStart","handleDragOver","handleDrop","handleDragEnd","preventDefault","currentHTML","innerHTML","_ChatListItem","_DragAndDrop","ChatList","then","handleChatCreated","handleChatDeleted","handleChatsCleared","handleChatUpdated","handleChatSelected","appendChat","elements","listElement","previousListElement","newListElement","currentChatId","chats","chatListItem","DownloadChatsButton","button","exportChat","exportChatMessages","jsonData","blob","Blob","createObjectURL","a","createElement","download","click","revokeObjectURL","errorCode","LocalStorage","_debounce","_ChatList","_DownloadChatsButton","_LocalStorage","Sidebar","settings","newChatButton","clearButton","hamburgerButton","searchButton","downloadChatsButton","searchRow","searchInput","toggleSearch","performSearch","handleNewChat","handleClear","toggle","listItem","scrollIntoView","behavior","block","inline","focus","escapeRegExp","string","replace","query","trim","queryContent","regex","RegExp","matches","filter","match","test","includes","contains","CopyButton","targetSelector","getAttribute","textToCopy","innerText","textarea","select","execCommand","removeChild","OllamaApi","abortController","send","onResponse","onError","onDone","response","postChatMessage","handleResponse","AbortController","signal","fetch","method","headers","ok","status","reader","getReader","partialLine","isRequestDone","done","read","textChunk","TextDecoder","decode","lines","split","pop","line","responseData","printResponseStats","abort","total_duration","totalDurationInSeconds","loadDurationInSeconds","load_duration","promptEvalDurationInSeconds","prompt_eval_duration","responseEvalDurationInSeconds","eval_duration","tokensPerSecond","eval_count","output","created_at","toFixed","prompt_eval_count","getModels","json","models","catch","DownloadButton","targetId","downloadElementContent","elementId","filename","DropDownMenu","buttonSelector","dropDownMenus","init","menuElement","closest","dropDownMenu","toggleMenu","menu","Modal","modal","handleShow","handleHide","List","containerId","items","clickHandler","setItems","setSelected","getSelected","ul","li","_OllamaApi","Models","load","getNames","findModelByName","find","_List","_Models","ModelsList","selectedModel","modelList","handleModelsLoaded","_Modal","_ModelsList","SettingsDialog","showButton","urlInput","modelInput","systemPromptInput","modelParametersInput","refreshModelsButton","loadSettings","parsedValue","prettyJSON","refreshModels","ChatSettingsDialog","ExportChat","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_ExportChat","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","exportChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","copyButton","goodButton","badButton","flagButton","quality","spellcheck","dataset","textElement","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userPrompt","userMessage","systemMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App"],"mappings":";;AiCAA,IAAAwf,IAAA,GAAA1V,OAAA;AACA,IAAA0B,KAAA,GAAA1B,OAAA;AACA,IAAAmB,YAAA,GAAAnB,OAAA;AAEA;ADJA,AtBAA,AqBAA,ADAA,AjBAA,AFAA,AeAA,AGAA,AZAA,AZAO,AFAA,AgBAA,ALAP,AFAO,AQAA,AlBAA,AyBAA,ACAA,ANAA,AhBAA,AeAP,AGAA,ANAO,AOAP,ATAA,AhBAA,AIAO,AGAP,AEAA,ADAA,AOAO,AQAP,AtBAO,AgCKP,IDLAwB,AtBAAA,AqBAAA,AlBAAC,AFAAa,AeAAA,AGAAb,AZAAD,AHAAE,AUAA0M,ACAAM,ATAAxI,ATAAnG,AEAAiB,ADAAA,AeAAS,ElBAatE,AFAAf,AgBAA+P,APAAhJ,AQAAqJ,AlBAA/Q,AyBAA+T,ACAAC,ANAApC,AhBAAlO,AYAA8J,AHAAhD,AdAAxM,GEAG,AWAhB,AUAA,AxBASvD,AIAO0G,CSAhB,AgBAA,A1BAiB,AmBAA,AGAjB,AFAA,CrBAkB,AoBAA,CRAlBoD,AZAmB,AsBAnBA,CXAAA,AgBAAA,AJAAA,ATAA,ATAA,AgBAAA,ClBAqB,AIArB,ADAA,APAqB,CIAC,AuBAA,AVAA,AjBAA,AgCKP/H,CNLQ,ACAA,AtBAA,AYAA,AFAvB+H,ATAAA,CKAwB,AeAA,ArBAA,AFAApD,AKAxBoD,ADAAA,CGAA,AeAA,AdAyB,AQAA,AhBAAnD,AWAA,CiBAzB,AtBAA,AqBAA,AdAA,AHAA,AMA0B,AIA1B,AxBAmB3G,AeAO,CFA1B,AgBAA,AVA2B,AMA3B,AzBAoBC,AuBApB,CZAA6J,AeAAA,APA4B,CaA5BA,AtBAAA,AqBAAA,AdAAA,AbA6B,CYA7B,AhBAuB,AOAvB,CHA+BlD,AKA/B,ADAA,CRAyB,AiCKA7E,CAAA,EtBLzB,AeAA,AtBAmC,A6BKP,CDL5B,AtBAA,AqBAA,AdAA,CbAqC;A4BCrC,AtBAA,AqBAA,ADAO,AjBAP,AFCO,AeDP,AGAA,AZCO,AHDP,AOAO,AGAP,ACAA,ATAA,ATAA,AEAA,ADCO,AeDP,ElBAEvB,AFAA,AgBAAA,APAAA,AQAAA,AlBAA,AyBAA,ACAAA,ANAAA,AhBAA,AYAAA,AlBAA,AIAA,AWAA,AdAA,AgCKA,EDLFiL,AtBAAF,AqBAAa,AlBAA4B,AaAAzC,AGAAa,AfAAnB,AUAAM,ACAAD,ATAAC,ATAAxB,AEAAkB,AcAAQ,EOAasO,AnBCA1N,AMAAiG,AIDAyE,ArBAP7W,AIAA2G,AICOkE,EyBILG,C9BLC/E,ADAAX,AyBAA2J,ArBAAtH,CIAT,AgBAA,AFAA,ARAA,AhBAU,CqBAQ,CAAC,CWAnB,AtBAAiC,AgBAAA,ArBAatJ,AcAAA,APAAA,AQAAA,AQAAA,ANAAA,AEAbsJ,ANAatJ,AFAbsJ,AhBAa,AIAA,AmBAb,COAqB,AzBAP5C,AcAD,APACgG,AQAD,AQAC9G,ANAAgR,AJAD,AlBAC,C8BAQ,A5BAP5R,AKAf,CyBAAsE,AfCuB,AEDP,ALAhB,AMAgB,AlBAArE,AIAA,AYAA,ATAhB,AcAAqE,CVAA,AICwB,ATAA,CuBDxB,ApBCyB,AkBDzB,AtBAAA,A0BKY,CtBJc,AGD1BA,AaAmBqF,ArBAA,AmBAnB,AhBAArF,AwBKa/H,CvBLb,AGAA+H,AaAA,ArBAoB,AFAA3D,AwBAAkF,ArBAA,AkBApB,ARAA,CeAAvB,AFAAA,A1BAqB1D,AyBAA,CvBACe,AOAA,AaAtB2C,COAA,AJAuB,ALAvB,CXAwB,AeAA,CzBAC,AoBAA,AfAzB,COAA,AaA0BuM,AlBA1B,ADCiCrM,CKDjC,AXA2BtE,AoBAA2R,CSA3B,AFAA,A1BA4B,CsBA5B,AQKuB,C9BLO,A8BKN,CAAC,CXLO,EjBAE,AHAA,AyBAA,ALAA9K,EjBAEnF,AHAA,AyBAA,MLAM,EAAE,EjBAE,AGCJ,CAAC,CHDK;A2BChD,AtBAA,AqBAA,AlBAA,AaAA,AGCO,AfAA,AUDP,ACAA,ATAA,ATCO,AEAA,AcDP,EOAE5G,AnBCAA,AMAAA,AXDA,AeAAA,ArBAA,AICA,AIAA,AODAgD,AdAA,AgCKA,EDLF+H,AtBAAC,AqBAA4O,AlBAAnM,AaAAuK,ArBAI,AFAApS,AgBAAnF,APAA,AQAA,AlBAAM,AyBAA,ACAA,ANAA,AEAJ4W,ANAI,AOAJM,ATAAjN,AOAAoM,CRAKpU,CcCQiW,AfAAxK,APAAjF,AEAAkB,AMDPxJ,CfAC,CKAC,AOAA,AQAA,AQAA,ANAA,AJAA,AeKAqJ,CvBLR,ALAS7D,AOAAiG,AQAAoJ,AQAAnQ,ANAApF,AhBAAqH,AYAA2K,AFAT,AZCS,AWDA,AdAAxP,C+BAT,ANAA,AxBAU,AOCO,CNDN,ADAAhC,AsBAX,AxBAWrB,AeAAsD,CLAXqG,APAY9G,AgBAA,AHAZ8G,AhBAY,ACAAtG,C+BAZsG,AFAatJ,AnBCAA,AeDbsJ,ATCatJ,AEDAgB,AEAAhB,ApBAAkB,C6BAA,AnBCC2J,AMAD,AIDCtK,AGAd+I,ADAA,CQAA,AFCsB,AxBDP,AoBAf,AzBAe,AOCO,ACAP/H,CsBDC,AjBAhB,AgBCuB,AZAP,AWDA,AtBAAsG,ANAA,AOCO,AQDP,AdAA,CKACa,AiBAjBY,CQAAA,ApBCkB,ANDA5C,AOAA,AUAA,AGAlB4C,AzBAkB3J,AICA2G,AWDA,AdAArD,CSAlB,AGAAqG,AeAmB1D,APAA,ALAnB,AhBAmB,ASCO4D,CuBD1B,ArBCoBsC,AeDpB,CvBAqB,ASAArL,AUAAA,ADAA,AGArB,CrBAsBoC,AHAApD,CoBAC,AnBAA,CIAC,AaAA,AKAxB,CQAA,AjBCgC,ARDP,AmBAzB,AzBAyB,AQCA8B,APDA,CYAzB,ACCiC,AMDP,AQAA,A5BAA3B,AQCD,CNDE,AIAA+H,AYAA,CPCC,ARDA,ADAA1C,AMCA,CLDC,AgBAA,APAA,AUAA,AlBCAqB,COACyF,AQDA,APAAa,AUAAhM,AlBCD,CcDE,ClBAC,AICO,A6BIpB,CAACW,CjCLc5B,CAAC,EGAE,AgBAA,AjBAA,AFAA,CWCC,ARDA,AGAA,CaAEsB,AjBAAA,AFAD,ASCJ,CEAK,ALDA6G,AGCJ,GWDO,AaKb,CdLe,AjBAA,AoBAD,AWKb,CXLc8O,AWKb,CrBLc,CAAClK,COAG,AjBAA,EIAA,EAAE,GMAG,CAAC,AUAA,CAAC;AUCzD,AtBAA,AqBAA,AlBAA,AaAA,AFCO,ACDP,ATAA,AOCO,AUIP,EJJE1M,AfAAA,AIDA,AXCAA,AEAA,EuBDFmc,AtBAA1R,AqBAAM,ADAI,AjBAJC,AFCI,AeDJ2M,ATCIlX,AZDA,AFAA,ASAA,AQAA,AOAA,ACAAmF,ANAA,AhBAAnE,AeAA,AIAJkW,ATAA/L,AhBAI,AIAmC,AICnC,AODA,AdAA,EkBAE,AjBAA1G,AsBCO0S,ADAAP,ESDb,AFAQ,AnBCA,ANDA,AOAA,AQAA,AEAA,ADAA,AZCA1M,AMDA,AdAA,C6BAC6O,AjBAT,AFCS3O,ANDAlE,AOAAkG,AQAAmJ,AEAAa,ADAAtW,CUAT,AJAUM,A3BAAhB,AQCA,CwBDVyJ,ANAA,AvBAW,AyBAA,AtBAA,AmBAX,CZAAA,AICY,AWDA0P,AtBAA9W,AiBCO,CQDnBoH,ApBCa,AkBAAtJ,AZAAgB,AHAAhB,AZDA,AEA0B2B,AGC1B3B,AgBAO,CGDpBsJ,AGCa,AfAA,AZDCrI,AoBAA,ADAA,AIAdqI,AzBAc,AOCAjE,ACAA,CLDC,AKCAqD,CEDf,ACCgBmC,AkBAA,AfAA,AUAO,CGDN,ALAAgM,AhBAA,AeAAtW,AGCO,AxBDPd,AIAsB,C4BAvC,A1BCO,AUDP,ATCkB,AEAAkL,CCDlBrB,AGAA,AXAmB,AOCAjE,CsBDnB,ADAoB,AnBCA,ACDA,AVAAF,AyBAA0F,A3BAA,AIAmBjJ,AGCnB,CmBDpB,ArBAqB,AuBAA,AHArB,ATAA0H,AhBAqBxJ,CoBAC,AEAA,ADAA,CSACW,AlBAA,AHCA,ADAA,CHDCkG,AsBAA,ACAA,ApBCA,CYDClG,AOAAoJ,AlBCA,CCDzB,ARA0B,CUAC,AVAA,C0BAC,AZA5B,CCC6B,AbDU,CaCT,AbDSjK,C0BAR,A9BAA,C8BACgB,AHAA,A3BAAjB,CoBAC,AOAA,A3BAA,AQCA,CYDCiN,AOAA,A3BAA,CQCC,CHDC,ADAG,CaCF,CbDJ/K,CaCOZ,GbDH,EaCQ,EaDC,CAAC,CbCG,CbDba,CgBAa,AZCA,CYDC,AdCZgG,AEAY,GJDd,CgBAkB,AhBAlBnG,CgBAmBoU,GhBAnB,E0BAwB,AxBCX,CwBDY,A1BAzBhU,IAAA,IgBAiC,CAAC,ChBAlCA,IAAA,EEC6B,CFD7BJ,GECiC,CAAC0F,AFDlC,EAAAtF,IAAA,CEC0C,GAC3E,CAAC;A0BDL,AtBAA,AqBAA,AlBAA,AaAA,ADAA,ATAA,AiBMAR,E9BNE,AqBCAvB,ANAA,AVAA,AeAA,ESDFoc,AtBAAnR,AqBAA4O,ADAI,AjBAJjO,AFCI,AeDJqM,AGCI,AxBDA,ASCA,AFDA,AQAA,AlBAA,A0BAA,ANAA,AhBEA,AeFA,AIAJhN,ATAAwE,AhBAI/P,AOCA+J,AEAApE,CPDC,CeCC,AEDA,AjBAA,AED2BxD,AWC3B,AdAA,E6BAE,AnBCA,AkBAA,AxBDA,ASCA,AFDA,AQAA,AQAA,ANAA,ADAA,AHCA4Q,AlBDA,ASCA,CqBDCgH,AnBCA3N,AkBAAoN,AxBDArS,ASCA6H,AFDA5B,AQAAmJ,AQAAhK,ANAAF,ADAAyK,AZCA1R,AcAAyQ,CJDCtU,AbEA0H,AFH2B,AGE3B,A0BKA,CjCNC,AID0B5G,AGE1B2H,A0BKA,CDNX,AdCY+I,AlBDA/S,AeAAwD,AdAAA,AgCMA,CvBNZ,AUAa,AICAlD,ANAAkE,AODb,ATAA,AiBMayJ,CFNb,AXAc,ACAA,AGCAjB,CQDdpD,ANAA,APAe,ALCA,AMDA,AhBDsB,AKEtB,AcAA,CbDfA,ASAgB/B,ADCA,AODhB+B,ATAAA,AhBAgB,C+BAhBA,ApBCiB,AWDA,ADAA7I,AdCA,A0BKA,CpBNjB,AaAA6I,AZCkB7I,ARCA,AYDA4E,AXAA,AEAA,AcAA,AUKA,C7BPmBzD,COEjBkK,AWDAC,AtBAA,AuBCA,CODC,AjBArBzC,AgBCqB,AxBDA,ACEC,ANFD,CgCArB,AbAsB,AKCA,ANAA,AXAA,AEAA,CCDtB,ASAuB9G,AMAvB,ATAA,APCuBpC,AMDA,AdAA,C8BAvB,ADAwBK,ADCA,AxBDA,AmBCAoX,ANAAnF,AXAArN,A0BKA,CPNxB,ALAyB,ArBAA3F,ASCA,CKAC,AODAkB,ANAAP,AdAAA,CaCCiC,AcDA,CfA3B,AFC4B,ANDA,AuBAA,ANAA,AlBDS,AGET,CFDC,AuBAA,A5BAA,AIDQP,AGER,CFDC,AOAA,AGAA,AdAA,CWAC,AGAAzB,AdAAA,C6BAC,AXAA,APAA,AZAAT,C8BACe,AXAAiR,AfDI,CyBEH,AXAA,EAAEc,AlBDA,CwBCC,EAAE,CVAC,ARCA,AeFA,ANAA,AdAA,CkBAC,ALCA,AODA,ANAA1P,AdAAA,CkBAC,CDCC,CZCC,CAACoE,AeFA,AHCAuL,CGDCrS,ANAA,AdAA,C6BAC,AfAA,AdAA,C6BAC,GTAG,AHCA,CZCE,AeFD,CHCC,CZCC,GQDG,CAAC,CKDC,CAAC,EAAE,CWAC,CAAC;AEChE,AtBCA,AqBDA,AlBCO,AaAA,ADAA,ATDP,EbCE,ASDA,AQAA,AlBAA,A0BAA,ArBCA,ACCA,AeAA,AUIAoc,EDNF/Q,ADAAkO,ADAI,AnBCA,AkBAA,AxBDA,ASCA,AaDA,ALAA,AhBEA,AeFA,AGCA,ANAA,AFDJpK,AhBAIhQ,AIFiC,AKGjC,EIASgO,AaAAmL,ATAP,AQAOX,AVDP/U,AdAAA,E6BAE,AnBCA,AkBAA,AxBDA,AcAA,ALCA,AQDA,ADAA,AGCA,AxBDA,C8BACuW,AnBCA7Y,AkBAA+E,AxBDAgB,AFCAf,AWAAoG,AQDAC,ADAAxJ,AGCAoV,ADCAlU,CNDC3C,AXCA2H,AYDAzB,AeKL,CjCNMzH,ASCA,AwBKLkd,GFNN,AlBCqB,AoBKZ,CpBLa,AIAP,AKDA,AtBAA,AQEApS,AeAA5G,AUIL,CtBLM,AkBAA,AZAA2D,AKDA,ACED,AUIJ,CFNX+B,ATAiB,AJCA,ATAA,CuBDjB,ARCkB,AxBDA5J,AeAA,AQEA,AtBFA,C6BAC,AnBCAe,AkBAAA,AxBDA,AUAA2C,AdAAA,CECCyC,AkBDA,AHCA,AOAO,COD3ByD,A7BCqB1D,AGCA,AkBDA,AfAA2E,CqBDC9J,AbCA,AZDAmG,ALAA,CiBCCpE,AIDA,ArBAA,C+BAvB,ALC+B,ApBCP,AUFxB,AhBAwB,CwBCCmU,CTDC,AdAA,CUCC,AkBAA,AfAA,AODA,ALA3BrN,ADA2BpI,AdAAA,C+BA3B,ArBEON,AkBDqBA,A1BAA,AWAA,ARCA,AeFA4V,CPCC,ARCA7N,AmBDO4N,AjBCP/L,CsBFC,A3BCA,AKCA1F,AOFA,AdAA,C6BAClE,CbCC,AZDA,AUAAsC,AdAAA,CyBCQqT,ATAP1E,AIDA,CAACvP,ALAlC,CQC6B,CAACoK,AhBCM,CFAC,CAAC,AEAA,GSDG,AQAA,CdCpB,AkBDqB,AZAA,AQAA,CdCpB,AkBDqB,AdDA,AdAA,CuBCL,ATDM,AdAA,C6BAC,AJCA,AjBAb,CqBDc,AJCA,AFAN2K,AfAPhS,CYDc,CAAC,EZCX,CAAC,CAACsE,GoBAgB,AZAA,CYAC,AZAA,EAAE,ARAb,CqBDc,ArBCb,CqBDc,ANCd,AfAC,CeAA4N,EHDgB,CAAC,IVEjB,CAAC,AaDO,CbEhD1W,AaFiD,CAAC,EAAEgX,IbE7C,CAACzV,QaFyD,CbEhD,AaFiD,CbEhD,IAAI,CAAC;AqBF9B,AtBCO,AqBDP,AfAA,AiBMA,CAAC,CpBLCpC,AaAAA,ArBDA,ASCA,AFAA8M,AQAAmJ,AlBAA,A0BAAhK,AHAAjM,AzBDA,AOEA,AEDA,AwBKA,EDNFqc,ADAAtC,ADAI,AnBGA,AkBFA,A1BAAnU,AwBDA,ALAA,AhBEA,AeFA,AGCA,ARDJ+J,AZFI,AIIA,AOFA,AQEA,AtBFA,CcAC,AdAA,CSCQzE,AUAP+K,AFDgB5Q,AHAhB,AdAA,CmBCA,CUDE,AnBGA,AkBFA,AZAA,AEDA,AGAA,AhBEA,AeFA,AGCA,AjBCAsE,CuBFCgQ,AnBGA/T,AkBFAqG,ATAA,AlBAA7G,AoBDA0R,AhBEAlO,AeFAlG,AGCAuJ,CGDC6C,AvBFAvI,CDGC,AKCA,AeAAxD,CpBDCP,C4BDZ,AlBCaxC,AaAAA,AxBAAoF,AuBAApF,AVDAqD,AdAAA,CYCA,AaAA,ATAC0O,AEDA2D,AjBCAzQ,AyBDA,AFCD,AlBCC0E,AQFA,AdAA,C+BAd,A5BFe,AGID,ACAC,CuBFfL,AlBCgB,AFEA,AeFA,ADAA,AjBCAW,AOFA,AdAA,C0BAC,AXAjB,ATEiB,CyBFjBX,A5BFkB/C,CMGQ,ACEP,APLD,CMGS,AoBDP,AFCA0F,AtBCA,AeFA,ALApB3C,CbCqB,AwBDAyF,ACCD,ANDC,ADAApM,ClBCCF,AgBDA,AbEA,CyBFtB,ADAuBhC,AnBGA,ACFAqM,AVAA,A0BAA,CjBECjM,ACFD,AUDC,AlBFA,C4BExB,A7BCyB,AgBDAI,AjBCAoE,AyBDA,CxBCC,ASAA,AeDA,CECC,AFDAxE,AHCA,ARD3B,CaC4B,AZAA,AKDA,ADAA,AGCA,CKAC,A3BAA,AsBAA,ADCV,CJFW,AIEV+C,COFW,AnBGA,AMFA3C,AEDAsG,AjBCA,AmBDA,CSAC3G,AnBGA0B,ERFE,AwBDA,AnBEA,CLDC,AwBDA,AnBEA,CSDC,AMCV,CNDWiF,AEDA,AQAA,ANAA,AEEV,CJFWyK,GEAG,CAAC7Q,CJCC,CAAC6Q,ATCA,CGCC,CmBHC,AnBGA,AUHA,AbEAlN,CsBFC,ATAA,CAAC,AEEV,CAAC,CJFW,CAAC,CXEC,CAAC,GSDG,CAAC,IaDI,CAAC,CnBGC,CAAC,AQHA,CAAC,KFCK,CAAC;AeAvE,ADCO,AfAA,ENAL,AoBDA,AzBCA,ASCAmH,AQFA,AECA,AxBDA,ASEA,ADAA,AeAA,ESFFmL,AnBCI,AFEA,AeFA,AGAA,A1BAA,ASAA,AQAA,AlBAA,A0BAA,APDA,AHDuB,AOEvB,AlBCA,CWHwB,CaEf4C,AJF0B9Z,ArBGjC,AUDO0P,AZHPpJ,AWEA/E,AdAAA,EYCE,AFEA,AkBFA,AZAA,AZAAqF,AcDA,APCA,AVAAxB,A0BAA,APDA,AZEAsF,CIDChF,AFEAA,AeFA,AGAAsG,AjBAAS,AgBAA/G,APDA9E,AICA,AzBDApB,C0BCC,ACFiC,AFEjC,AlBCAwB,CJDC,ADAA,CeAC,AZAA4F,AcDA,AQDiC,ArBGjC,CWDCiL,AZAD,AcDC4D,AHCO,AhBDP,AOEA,AQFA,AdAA,C+BAb,ADCqB,A7BAN,AcAM,ADDPjU,AdAAA,CSCCyJ,AqBAO,AFAP,AxBAA,AFAA,CUAC,AFEA,AkBFA,ADAA,AtBCApE,ACAA,CyBFhBuC,ArBGiB+B,AkBFA,A3BAApG,A0BAAjE,ChBAC,ARHA,CSGCP,ADAAsM,ARHA1G,AKIAuE,AMFA,AdAA,CaECqB,ALAD,AMFC,AdAA,CaEA,ARAC,CKCC,ALDC,ACAD,AEAA,CKAC,CkBFvB,CtBCyBd,ACEA,CDFCN,AEAA,AVAC,AEHD,AGIA,CMDC,AIAA,ALACmC,AaAD,ArBHA,AGIAhN,CMDCY,AXAA,AmBDA,AICA,CdEC,AMFA,AIDA,CXCC,ACEAiK,AUHA,CTCE,CFAAxF,AgBAA,CAAC,AEAA,CjBEC,AiBFA,CjBECgG,AQHA,APCE,CFAD,ASDAqK,ETCE,AHCA,CAACjO,CICC,CJDC,CMDC,ANCAhF,CMDC,CMDC,CSCC,ArBCA,CYFC,AZEA,CqBDC,GrBCG,AQFA,AdAA,CMECzC,CQFCqD,AdAAA,C2BCC,AbDA,AdAA,CYCC,APCAsF,ASFA,AdAA,CYCC,EMDE,ASCA,CTDC,ASCAwD,ItBCK,ACAD,CAACnE,CDAC,CAAC,IsBDI,CAAC,CAAC,CAAC,ArBCA,EAAE,IAAI,CAAC;AyBD/E,AFAA,A9BAA,AQEA,EuBDEhI,AFAA,A1BAA,AmBAAsM,ADDA,AGEAL,ARDAjM,AOEA,ESHFsc,AtBCI7S,AGAA,AFEA,AeFA,ArBAA,ASCA,AMDAhJ,AlBAA,AyBH4D,ACG5D,AtBCA,AYHA,AOEA,AlBCA,AEAA,AMFA,AdAA,C0BF6D,CRE3D,APCAuM,AeH4D,AvBA5D7G,ESGE,AFEA,AeFA,ArBAA,ASCA,AZDAd,A0BAA,AVFA,AOEA,AlBCA,CMDC1E,AFEAiF,AeFAuS,AZCAzJ,AcDA9I,ANAA0G,AGAA6L,AlBCA,AgBCAb,CbFC,AOAA7V,ALAA,AUAAyD,AlBHA,AKIAkF,CCDCV,AEAA1I,ARHA,CCGC,AeAA,AlBAA,C6BAChB,A1BAA6G,AeAA7F,AJAAhB,ATCA,AgBCAsX,CQFA,A7BAClX,AcAD,AZHCyB,AGIAzB,AgBCD,CTDE,CiBDC,ApBEA,AGDAY,AZDA,A0BAA,AZAA,ATCA,AgBCA,CbFC,AGAA,AFEAqE,AMFA,AWAArE,ANAA,CZAC6J,AOAAnJ,AfAA,AEHA,AGIA,AEAA,CuBFlB,ANCmB,AJAA,AGAA,ArBHA,CSGCjB,AWCAwL,CbCC,AaDD,AfAC,CuBFrB3C,AtBCsB,AgBAA7I,ADAAA,CRAC,AOCA,CdDC4E,ACEA,AMFA,CZAC,EAAE,AOAA,AHCAkF,CCDC,AGAA,ADAA,CoBD5B,AtBC6B,AGAA3J,AOAA,CMAC,ANAA,AKAA,CCACA,ADAAA,CXCC,CAAC,AcDA,CAAC,GRAG,ERAE,AQACK,CNCA,CFDC,CECC,CDDC,CAAC,AOAC,AQAD,CFAC,AdAA,AaAA,CCAC,AdAAgM,AgBAA,AHAA,EXCE,AMDE,GXCZ,CmBDc,AnBCbzC,ImBDiB,CAAC6B,IhBAI,CKAC,ALAAD,CKAC,AQAA,CAAC,EbAE,AHCb,CGDc,AgBAA,AnBCb,CiBDc,AEAA,CfAC,AaAA,AEAA,CfAC,AeAA,CfACvL,ADAA,AHCb,CAACT,CGDc4M,CHCZ,CAAC,EGDe,CCAC,ADAA,CAAC;AoBA/E,AFDClK,AtBEAA,EqBCCoJ,A1BAA,AyBDA,APAApL,ANDA,AdAA,E+BAFyb,AtBCI,AqBAA,AlBAA,AaAA,APDA,AGCA,AhBCA,AkBAAxX,ACDA,ATAA,AZHA,AKIA,AcCA,CJHC,AfFA,COIqB3E,ANDpB,AcDA,ALEA,AFDA4M,AQAA,AlBAA1H,AgBFA,AXGA,CuBHL,AtBEA,CuBAO,ADFPiU,AjBEO,AFCoB,AeDpB,AGCArN,APDA,AhBCA,AmBDA,ATAA,APCA,ADDP3B,AeEO,CQFCiC,AlBAAP,AaAAA,AGCD,A1BACnG,ADDA,AoBAAgR,AGAAsB,ATAAvI,APCAzF,AcCA,CbFCS,ACCoB,AMDpB,AHCA,AFDA,ALCA,CsBAC,AfAA8D,AFDA3N,ALCAZ,CFDC,ACCA,AYHAyS,ChBEE,AICDxL,ACAA,AgBCA,CbFC,ACCoB,AYCpBzD,CbFCgG,ACCoBiB,CmBHlC,AzBEe9D,AmBCP,AjBAO7F,CyBFhB,AREU8D,ACDO,ATAA,APCA,CsBDC,CrBAC,AoBFlBuU,AnBGsC,AJApB,ACDlB,CwBDDjQ,AtBCoB,ACCoBlJ,ARApB0F,AGAA,AYHA,AOEArF,ATAA,APCA2J,AcCA,CbFC,AqBAA,A1BAA,AFCAxE,AWAA,AZDAP,AoBAA,ADAAvE,AEEA,ClBFC,ASCA,AODD,AbApByJ,AeEqB,CTDC,AUAP,ANHO,CIECrF,AhBCA4C,AeDA,AGCP,ARDOyH,AOEA,CQFC0J,A7BAA,CAAC7Y,C8BD1B,AFDC,AjBE0B,AaAA,AdAA,CCAC,AaAA,AvBCA,ASDA,AVAC,AuBAD,AhBCA,CIDC,AaAA,ARFA,AOEAQ,CtBCC,ADDA,CoBAC,EJFE,AVEhC,CFCiC,AYHAkS,EZGE,EMDE,AYCP,EZDS,AYCP,GCDU,CbAC,AYCP,ACDO,CMAV,AnBAW5F,AYCP6K,CODH,CAAC,A1BAW,CAAC,CaFC,CAAC7T,AFEd,CAAC,CAAC,CEFe,EAAEmB,AOEA,CAAC,GbAG,AMFA,CNEC+G,AMFA,GMGJ,CZDQ,AYCPA,CZDQ,GYCJ,CZDQ,AYCP,CZDQ,CAAC,EYCL,CAAC,CAAC;AQDpE,AhCAA,E0BCE,APDA,ASEAD,AJAA,EQFFqQ,AtBCI,AqBAA,AlBAAtR,AFAuC,AkBCvCA,AxBDA,AFCAtF,ADDA,AyBHA,ALGA,ADAA7E,AIAA,ATAA,AZFAyF,AGGA,AEAA,CEDwC,CGCtC,AFDAwG,AQAA,AdCApE,AYHA,AKIA,EQFE,AdAA,AQAA,ATAA,CeACqR,ANAA5B,ATAAvM,CFCC,AFDA,ASAA,ClBCC,AWAA8C,AFDA5N,AUAA,ADAAA,AZCA,CNAC+E,AiBDAmQ,AFFA,CUGC/J,ALCA,CKDA,CNDE,AbCA,CmBAC,ANDA,AJFA,AdAA,AKGA/B,CsBDC,ATAA,AhBCA,AYHA2I,AFEA,AZFA1M,AmBIA,CjBDC,C0BFlB,APCmB,CMAC,AfAA,EgBDpBiD,APCsB7I,CLAC,CWAC8Y,AfAA7L,AZFA,AKGA,CLHC,CgBECzM,CjBCC,ASDA,ASAA,ClBCC,ASDA,ASAA,CWD5B,AlBE6B,CAAC,AWDA,CXCC,AMDA,AFFA,AOEAL,CZAd,AgBCA,ATDe2G,AFFAJ,CLEdsE,AgBCAA,CjBDgB,EAAE,CSAC,ClBCC,AiBDA,CjBCC,AiBDA0K,ACAClV,AHFD,CNEC,CAACkM,AMFA0F,CaET,AfAA,CeAC,AfAA,CeAC,AVAW,ALAX,CSAW,CLAC,AKAA,CZAd,AgBCA,ATDe,CPAd,AgBCA,ARDiB,CRAhB,AgBCA,AXHe,CLEdlF,AgBCAA,CjBDgB,AQAA,AFFA+E,CNECtG,AQAA2J,EPAb,AgBCA,ChBDElL,AgBCAA,CjBDe,CAAC,ECAZ,AgBCA,AJDc,CAAC,CbAC,AMFA,ELEX,AgBCA,AjBDamC,AMFA4F,GEEG,CRAC,AQAA,CRAC,CAAC,AMFA,CAAC;AcEtE,AhCAA,E0BEE3G,APDA0J,AGAA,AEEAoC,AfDA,AMFA,AdAA,E+BAF0E,AtBCI1X,AqBAA,ApBAA,ANCA,AFAA,AWAA,AZDAtD,AyBHA,ACIA,AVHA,AOEA,ATAA,AZFA4E,AGGA,AgBCA,CTDC,AIHA,CLEC,AgBCA,AfAA,AFDA2G,AQAA,ACAA,AHFA,EaEE,ApBAA,AMAA,AWCA,AtBDYtE,AmBAZ,ATAA,CeAC8Q,ApBAA5T,AiBCAA,AHDA0S,ATAA1S,CHAC,AgBCA,AjBDA,AQAAsQ,AOHAjH,ANGAhO,CRAC4J,AgBCAA,AxBAA,AFAA,ASDA7J,AVAA,AyBHA,AvBCA,AGGA,CLDCsE,CgBFC5D,CDECuQ,AUHAxR,AvBCAW,CSEC,AgBCA,AxBAA4F,AFAA,ADDA,AmBAA,AdCA,CGDN,ACAO,ATAA1B,A0BCA,AtBDY,AeAZpE,ALAA,CNANkE,ACAO5C,AiBCAA,CfDCqI,AgBCAA,AXHA,ChBEC,AmBAA,ALAApK,CeAC,ALCAwL,AxBDA,AsBEA8L,ANJA,CREN,AgBCM,ANDC,AIED,CdFL,AGAO,AgBCA,AxBAA,AsBJA,CKEtB,ADCuBtX,ALCA,ArBAA,AeDA,AOHAyO,AHKA,CPFC,AZCAjI,AcDA0O,AEAA,AjBFA,CeECC,AfFArP,C4BCzB+C,ArBC0B,AiBCA,AHDA,CdAC7G,AMAAhC,ALAA,AgBCAgC,AZDA,CJAC,AIAA7B,CSAC,CdAC,AiBCA,AxBHA,C2BEC,ApBAC,ANCD,AuBAA,CGDCA,AVAA,AjBFAwF,C4BChC,A3BEiCc,AoBDA,CNAC,AEAA,AIAAsP,CfAN,AOAO,CAAC5V,AEAAiV,AQHA,AvBCA,CMENhL,AEAO,AeHA,AvBCA,COEC,AiBCA,CvBAC,AODA,AgBCA,AHDA,CEHC,AFGAvI,CfAN,AiBHO,CjBGN,ACAO,AKAA,CLACuI,ACAA,AIAA,CXCC,AcDA,APAAuC,EmBAE,AZAA,CYAC,ApBAA,CAAChN,EAAG,AMAD,CAAC2R,CNAC,AKAA,CLAC,AcAA,ATAA,CSAC,GbAG,CAAC3F,GmBAG,CAAC,AnBAA,CAAC,EKAE,CAAC,CAAC8F,ALAA,CAAC,CAAC,OKAO,AQAA,CAAC;AOC7E,AhCDA,EUCE,APCA,AWAA,AcAA,ANAA6E,AlBHA,AGGA,AECA,AMHAzT,AdAA,CGDC,C4BEHoZ,ADAI,AlBAA,AFAA,AeCA,APDA,APAA,AVAA,AyBHAzN,AHKA,ACFA,ATAA,AOEA,CVFC,ADAA,AeHA,AZEA3L,CFCC,AgBCA,AxBAA,AODA,AeHAU,ATCA2O,AHCAzR,EgBCE,ApBAA6K,AeCA,ATDA,AGAA,AdDsBpE,AeCtB,AGEA,ACFA,ATAA,CeAC8R,ALCAtB,AFCAL,ACFAS,ATAAzI,ADDA,AdAAxM,C4BEC,A3BDArC,AyBHA,ALIA8V,COAC/K,APAA6K,APFqB,AQGrBtE,ClBDCpL,AgBDA,ApBDA7D,C+BCZ,ALHaS,ANGA5C,AHFA,AjBCAD,CmBCCkV,AFFAjP,ChBEC,AOEA5F,CuBFf+H,ArBAgB,AgBHA,ALIA,ArBFA,C0BFC0F,ANGA,CnBAC,AoBCA,ADDA,AGEA,AvBHqB,CyBEpB,AGAA,AxBAA,AgBDA,AGEA+H,CEDC/V,AGAA6J,CEDC,ApBAA,AOFA,CbGCzD,AHDA7B,AcAA,CgBAtB,AdFuB7D,CaECjB,AFCA,ClBDC,AKAA,APEAc,CoBDC8J,ATDA,AXED,CEFE,AaEA,CAACgM,ANJA,ATIA,CWFCnB,AFFA,AOEA,ATAA,CAACtQ,CaCC,AxBAA,AkBCX,CQFY,AFCA,AxBAAkB,AsBJA,AFGA,AFEXuO,CQFYzU,A7BAA,AyBHAkO,CzBGC7J,EwBCE,ArBAA,AoBDA,CCCC,ArBAA,AsBJA,AFGAuR,ATAA,CWHC,AXGAlU,EIAE,CfCC,AeDAA,AGEX,ClBDYoE,AmBCR,ACFQ,AFEX,CrBFY,AsBER6Q,ACFQjV,CCCC,CxBDC,CwBCC,AHCX,CQFY,AREXsB,CQFY,A1BCA,EqBAE,ArBAA,CqBACvC,AFCR,ARFQ,CQEP,ARFQ,CQEP,ADAH,ClBDY,AeDA,AIER,ADAH,CGDY,ArBAAuF,AeDA,AGEX,CGDYwF,ADDA,CAClD,AFCyCmJ,GGDa,CAAC,EKDE,AREV,CQFW,CLCC,ArBAA,CqBAC,ArBAAlO,CqBAC,AHCT,GPFY,CAAC,EXCE,CAAC,IeDI,CAAC,GKE3E,CAAC;AOHL,AhCCA,AIDA,EMGE,AGDA,AVEA,AWAA,AFFA,AgBEAgF,AJAA,AjBAA,EwBFE,ALCAtH,AGAA,AVDA,AQHAkK,ALIA,AJHA,AOIA,ATFA,APEA,AMJ4B,AdAO,C4BGlC,AFJA,ChBGC,AkBCA,AxBCA9H,AHFAhC,AyBHAgK,ArBCoC,AeEpC,AEEAkI,CjBJqC,CyBEnC,AdAA,AHEA1I,AMFA,AECA,AhBHoC,AmBIpC,ATFA,ATEA/E,AQJGrG,AdAOA,C8BET2W,A5BEAlU,AmBDA6Q,AGCA2B,ATFAzI,CLAC,AQAAnK,AVEA,CEFCA,CSACwQ,AlBAA,A0BEA/J,ArBAAzC,AgBAA,ClBAC,AuBAD,ArBAA,AgBAC2L,CNFCpD,AZEA7K,AHFAjC,AyBHA,ALIA,AbCA,CCDC+F,AkBCA,ArBAA,AEAA1C,CiBDN,CAAC1D,APDO,AQHA6Q,ALIAgB,CXDC,AGEAlI,AZFA,CSACnM,AGED,ASAC,CJFC/B,AHAA,ADFG,AdAO,CIIT,AFAAuF,AWAA,CGFC,AdEAJ,ADFA,AoBCA,ACCA2P,CQFC,ALCP,AxBDO,AcAA,APEA,AMJA3T,AdAOA,CyBGb,ArBCQX,AeFD,AlBAA,AOEA,CCDCmK,AODA3K,AUHA,CjBIC4E,AqBDA5E,AXAA,CJAC,CLAC,AQAA,AMEA,ATFAmF,AOEA,CZFCnD,ANEC,AFAD,AgBFA7B,CTCC,CPCC,AsBAA,CfDC,ACDA,AIFT,AdAO,CUEG,AMAA,AZEEsG,AIAF,AMJVtH,AdAOA,C8BEI,AdAAsP,CcACtO,ANEA,ATFA,APEA,CgBAC4V,ATFAlU,APEA,EiBDL,CrBCU,AUJlB,AdAO,CyBGG,ArBCSrB,CoBAD,CAACqB,CdFC,AQAA,AVEA,CEFC,AeCP,APDOsT,AVEA,CiBDN5H,ArBCS,AIAF,CJAGzG,CYFD,AFFxB3F,AdAOA,CgBEkB,CcAC,AfAA,CeAC,AfAA,EXEI,CAACF,AcFF,CAAC,CMEC,CACjD,AVLiB,AdAO,EgBE4B,AZEE,CYFD,AZEE,IqBDL,CAAC0K,AXHlC5I,AdAOA,CeEmC,CAAC,EeAE,ALCP,CKDQ,ALCP,IAAI,AXH3C,AdAO,CyBGqC,CAAC,CXH7C5B,AdAOA,IwBM1B,CAAC,IVNkB,AdAO,McAJ,AdAO,IcAH,AdAO;ADErC,EaEEqK,AaAA,AGAA,AjBAAgB,AYEAX,ANLA,ATIA,ECDE,AqBDA,A5BEA1G,AgBFA,ALEA,AcAA,ANDA,AhBHA,AeEA,AIIA,ATJA,ATEA,AQJA,AdAA,CoBEC,CVAC,ANEAuB,AHFA3B,AmBAA,AEEAzC,EbDE,AqBDA,AdAAoP,AEAA,ASEA,ANDA,AGGA,ATJA,ADFA,AdAA,CSGC9M,AqBDA8U,AZAAvU,ASEAA,ANDAsG,AEEAI,ACCAwL,ATJA9H,CFEC7I,AMFA,AIGAjC,CrBDC,AIAA,CJACe,CODC,ALCA,AHFA,CGECuB,AeFA,CVCC,AUDA6O,AlBAA,AoBCA,CLDC,AEAA,ASEA,ANDA,CLDCpT,AHEA,AFDAgK,AgBCAzK,ANDA,AEEA,AjBDA,CYFC,APCAwK,AaGA,CvBJC,AsBGA,CXFCf,ACCA,AZFC,CWCD,AYGC,AlBFA,CUFC,ALCA,ALCAjM,CMDC,CVCC,ASDA,AIDA,AOEV,CNFWiS,AdEA,AiBFA,AKIA2F,AFFV5U,CQFW,AjBEA0H,AMFA0L,AQEA,CAACvT,AZFApC,COET,CQFWA,A1BEA,AkBAV,GlBAcQ,CuBAA,ArBAA,CqBAC,ArBAAwG,CUFC,AdEA,AaFA,CFEL,AEFM7G,ATEA,CwBFC,A1BEC,AFAD,AWANyJ,APAMhC,AgBAV,CQFWzH,AXAA,CAAC,AGEVyW,ChBAW,CFAG,AuBAF,ArBAA,CqBAC,CdAL,CAAC,CAAC,APAM,AgBAV,ChBAWrX,AgBAVuV,CpBAW,AsBEZ,CtBFa,AsBEZ,ETJc,CAAC,CeAC,AREV,CQFW,AREV,IhBAc,CAACvN,EkBEV,EAAEjF,KTJiB,ATEA,CSFC,CTEC,IAAI,CAAC,CwBFC,CAAC,INIlB,CAACoB,QAAQ,CAAC,CAAC,CAAC;AOJtE,AhCAA,E0BGE9C,AGAA2K,ADAA,ANDA,AhBHA,AeEA,AHDA,AXGA,AECA,EsBHE,AlBCAjH,AFDA,AREA,AWCAoC,AFFA,AVDA,AyBHA,AHMA,ACCA,ATJA,CdAC,CQCC9B,AgBCAhE,APFAI,AjBAA,AaFA,AQIAsD,AtBJA,CyBIA,CKFE,AdAAtE,AZEA,AODA,AQDA,AIGA,ANJAqS,AOKA,ATJA,CeACsH,ALEA,AdDAvN,AYEAiL,ACCA7L,ATJAgE,CNCC,AmBCAjE,CAACX,A1BAA,AWCA,CAACtD,ACLA9E,AdAAA,CSGC,ASDA,CTCC,ALCAwE,AcFA/F,CTCC,APCA,AMCA8G,CIFN,AgBCO,AZFA,AZEA,CQDNxD,AIDOtE,AFFA,AdAA,C4BIC,ALCA,ADDP,ClBAQO,AcFA,AKGA6V,ADDP1R,CJFQ,APCA,AHEAoD,AMLArF,AdAAA,CgBEC,AHGA,AEHA,APGD,CQHEP,CJCN,ADAOoK,AMFA8F,ATIA,AcDP,CVDC,ARCO,ASCA,AIJA5O,AFCAzD,AOEP,ClBAQ8G,C0BFC,CnBCC,AMFA,AOKA,CAAC,CMJC9G,AbDA4E,AOKA,EpBFE,AmBCA,CnBDCqC,AWFA,ADFA,AdAA,CgBEC,ACDA,AFCA9G,ADFA6C,AdAAA,CgBEC0O,AOGAjN,CNJC,CJIC,CiBHC,AlBCP,CkBDQtE,A1BEA,AkBAP,CVDC,AMDO,CAAC,AJFA,AQIPyW,AtBJO,CuBKC,ATLAnW,AdAAA,CgBEC,CJCN,AIDO,CJCN0M,AEHO,AdAA,CcAC,AdAA,CsBIN,CPFQ,AOEP2H,CPFQ,IeAI,CAAC,AREP,CAAC,OVDO,CAACnJ,CGDQ,CAAC,EHCL,CAAC,IAAI,CAAC,CAAC,EkBDS,CAAC;ACArE,AJGP,A5BHA,EGGE,ASDA,AUCA4K,AhBHA,AeEA3V,AdEA,EGFE,AqBDA,AlBCA0D,AFDA,AeEAsS,AGAA,A3BFAtW,AyBHAN,AHMA,ANJA,AOKA,ATJA,APGA,AcDA,CAAC,CSHQkc,AbCP,ALGA,AMHA,ACCAtb,ANHA,AQIA,AtBJA,CoBGA,CUDE,ApBAA,AkBEA,AxBAA,AaHA,AOKA,ATJA,ATGAiH,CyBJQ,ADCP+R,ApBAArO,AkBEApG,AvBHAiD,AeEA,AHFA2J,AOKAiG,ATJAvI,CgBDQ,AlBIP7K,AZHA,AOGAkF,CPHC9E,AsBGA,CGNC,CAAC/E,ALKAsW,APJA/T,AdAAA,CIIC0E,ASCA,AQDAoE,AfCAzD,CiBAC,AjBAD,CMFL,AgBCO,ALCAwP,CXFN9S,AFDO,AkBEAzC,AfCA4E,AaNA,ApBMA,CIHC,AeER,ACLQvE,AZCA,AdAA,CUEC,AeER0U,EDEU,CHFC,AGEA,CZHN,AaCD,ADEQ,AVNA,AdAA,CYGN,AaCD,AZCQ,AZHA,AoBEA,AJHA,CaCC,ALER,ArBAQ,ASCA5P,AZHAzG,AsBGA,CEDP0M,ApBHQ9E,AkBIA,ClBJCC,AkBIA,ANJA,AHDA,AdAA,C8BECrI,AFEA,AxBAAQ,AWFA,CWHC,CDKP,AxBFQ,AyBHAgO,AZCA5O,AdAAA,CyBIP,AGAQgL,AfCA,AZHA,AyBHA,ATEA2H,AFCA,CWHC,CtBKC,CAACpL,ACHA,AGIb,AMLa,AdAA,CeEC6G,APGbjG,AMLa9E,AdAAA,C8BEC,AFEA,AvBHA,CyBCC9C,AlBCP,AaCD,EbDG,CgBCQ,ApBCb,AMLa,AdAA,CQKZ,AMLaqC,AdAAA,CQKZ,CIFO,CAAC4K,AgBCO,CAACqL,CXHC,AHDA,AdAA,CIIC,AaHA,AHDA,AdAA,CIICvR,AaHA,EHDEpE,AdAAA,C8BEC,CAAC,KFEK,ExBAE,EQDL,CAAC6I,AEHO,AdAA,IYGH,CAAC,IAAI,CkBDQ,AlBCP,CkBDQ,AlBCP,EGDZ,CAAC,CAAC;AbGxD,AyBDCtJ,A5BFD,EgCAE,AHGA,AjBAAoK,AVFA,AsBGA,ACCA,AFFA,EbDE,AqBDA,AlBCAnI,AFDA,AQAA,ACAA,AOHAkK,ALKAxN,AhBHA,AeEA,AHFA,AFCA,ATGA,AEAA,AMLA,AdAA,CmBEC,AOHA,AZCA,AdAA,CyBICyJ,ANFA,AOHAkE,AZCA,AdAA,C2BGL,ClBAO,AqBDA,ApBAA,AMAA,AZEA,AuBDP2J,APAO,ALDA,CgBDC6D,AtBEAvX,AqBDAiV,ApBAArO,AUCAwK,ALDAtG,CEDC,ATIA,CkBNC,ALKA,AfCA,CyBJCyM,A3BGA,AsBLA,ALKA1a,CUHA,AtBEC,ALCA0E,AsBLA,AZCAvD,AdAAA,CSGCgI,AKHA,AdAA,C+BCC,AvBIA,CIFN,ADCO6B,AHCA1E,AMLA,AdAA,CYGNxD,ADCO3B,AgBDhB,ANCgB,AfCA,CKDC,AUAC,ANFD,CNCC,AWAA,CTCC,AgBDnB0V,APAmB,CXAC,AWAA,ALDAtY,ATGA,AEAA,CFACT,AEAA,CIFN,ARCO,AICA,CIFN,ARCO6H,C0BFC,EpBAE,CoBACpH,ApBAA,AWEAsL,CXFC,AiBC5B,AZD4B,CAACnL,CXEC,CAAC6G,CECC,CmBDd,ArBAe,AECAA,CmBDdgE,CKFgB,A1BEA9D,AiBAC,AfCD,CwBHC/G,AxBGA0H,CMFN,ASCO,CAAC,CTDN,GNEU,CMFN,AGDO,ATItC,CMHgCwF,AGDO,EXEE,CEErC,CmBFwB,ArBAe7M,AEEtCjB,CmBFwB,CKFgB,ALEf,CKFgB,ALEf2N,ErBAiB,CAAC7F,CqBAd,CAAE+C,AVFc,CAAC,ETIpC,CmBFyB,AnBExB7C,EMHiC,CAACoE,CaCL,ArBAa,CAAC,EQDL,CAAC,CNG9B,EwBJwC,AxBKlE,CwBLmE,AlBCP,CAAC,CAAC,CNI1D,CAAChM,EACP,CAAC;AJJJ0C,ADDD,ESAE,AkBGAiO,ATHA,ACCA,AGGAkG,ACCAhL,AlBCA,AEHA,AcAA,ESJElM,ADCAmL,AlBCAnG,ADCA1B,AeLA5C,ALKA,AhBHAqI,AUCA,CJEC,CFDCzD,ALCA,ASCA,AFDAgI,AMJM4F,AHANxR,AdAAA,C4BKCsP,AxBDA,AFDN,CuBCO,AGCD,AZHCoB,AdCPzM,AmBCO,ANFA,CMECqG,ANFAqE,AOGA7H,CbFC,AmBEA,CnBFC8C,APAV,AGFU,CoBGC,ACLA,ArBEA3C,CoBGCsF,ACLAtN,AHOAuW,ATNA,AdAA,CEGZvR,AqBGY,ATNChE,AdAAA,CsBKC6G,CbFC,AGAP,AIDO,AOIA,ADDD,CVFLvD,AIDOoN,AdChB,AwBJgB,ALKA,CKLCE,AJMA,CbFC,AKHA,AdAA,CWIC,AUAAvG,AhBHA,AmBMAE,ATLA,ADFA,AdAA,CWIC,ANHAlD,AmBMD,CbHE,CCDN,AIDO,AQKA,ATLAtI,CHCN,AIDO,CAAC,GKEG,CZDC,AiBJA,CAACwO,CDKC,ACLA,AXGA,CeAd,ALEepE,ACLA,AXGAjK,CeAd6K,CCDA,CAAClK,CNGiB,CbDN,AaCO,CpBHC,COEN,APFO,IOEH,CAACwM,CmBFR,CAAC,A1BAgB,AUCA,CgBDf,ADCC,AfAe,CeAd,AzBDe,CyBCd,CAACJ,GhBFkB,AdAA,C8BEd,CAAE9C,AhBFcxH,AdAAA,CcAC,AdAA,CcAC,AdAA,E8BEZ,ElBCS,AGDO,CHCN+I,AGDO,CeAZ,GlBCS,CAAC,IAAI,CAAC,CAAC;AXDjEtJ,AFAM,EWELoJ,ACCA,AQDAmK,ACCAlV,AdKA0I,AEHA,EuBLE,AtBEA,AGAA9E,AgBEA,AVHA,AGEA,AEEA,ANPe,AOQf,ATLA,AOGA,CLNgB,CaGd,A1BEAoC,ASCA,ARJA6B,AeGA7H,ArBHOpB,AeDP,AdAA,CCCL,AmBGK,CVDEmM,AeCA,ATFAzL,AfDPsE,AoBGO,AJLe,AOQf,ATLA,CLCA,AWCCmH,ADAA,AIGAkM,AlBEAvO,CyBRCgT,ADCA,AFGA1D,AfAAtK,APID,CwBPEhE,ApBCA,AaGA,ADDAwM,CZFC,AeCA,ANDAhB,AFJe,AFGf,ATOA,CyBRC,ANGAI,ArBAA,AeDAH,AlBFZ,AIAY,AYFe9D,AFGf3C,ADFAtM,AdAAA,CIICwE,C0BFC,ATEA,AhBHA,AkBKA,AfAAzE,CuBLC,AnBEP,AIDO,AfDfyB,AoBGe,AEEA+S,CXHN9S,AIDOqN,AGCA,AECA,AGGA,AFFA,CQHCxH,AFGA,AfAA,AWEA7J,AhBDAsC,AcDAiS,CHFC,AdFA,AGKAnV,CuBLCuc,AhCAO,C6BINlc,AfAAJ,AZJpB,AcCoB,AhBDO,ASKP,CsBJC,AfAAiD,CgBDC,AnBEP,AaCO,ArBAA,AIEA,CuBLC,AnBEP,AaCO,AHCA,CSJC,ANGA,AZCA,AUCA,ARJA,ADFA,AdAA,CIIErC,ASCDX,AUCAyL,ARJA,ECAE,ACHe,CWMd,AZHA,CYGCqN,CxBDE,GmBEE,ACCA,CRLC,AZEE,ASCF,AWEA,CRLC,AHGA/T,EDFL,EAAE,ACEO,CWEC,CXFC,CeAC,AfAA,AWEA,CZJN,ACEO,CDFN2I,AGDO,CAAC,EaGE,CJEC,ETLE,CaGC,CAACpI,EbHE,EAAE,GaGG,GhBFJ,CAACwG,IAAI,CAAC,IAAI,CAAC,CAAC;EAClE,AFCAH,ACCAkB,AUDA,AEEA,AxBLAnN,AuBIA,ESJE,AtBEA,AmBEA,AVHA,ACCAsW,AOJA,ANKA,AHLA,AXUA,AEHA,AMNA,AdAA,E8BEE,ALEA,ApBHArN,AmBMA,ATLA,CUEC,ChBDC,AgBCA,AGCA,AxBDA,AeDA,ACCA,CXDC5D,AmBEA8T,ATFA3W,ACCAkU,CUFC,AZAA7V,ADHAgS,AFGA,APIAhI,CuBLCgS,ADCA3Q,AfAAtG,ATOAvF,CFLC,AOCA8M,AaEAlK,CfJC,ALCA4D,AOCAmG,AZJAhN,CgCAC,AtBEAqE,AVFApE,ASKA,CFGC,CAACK,CwBPC,AFGA,AVHA,APGA,AaEA,AhBDA,CsBJC,AXCA,AFJA,AFGA,CNCC,AqBDA,AFGA,AjBAA,AQFAmQ,AdFA,AeGA,ALFAjO,CLECyJ,AQFArG,AEEA,AIGA,CfJC,ACCD,ALHC,AeGA,AHLA,AlBEA,EWGE,AXHA1F,ASKA,CgBCC,CpBHC,AeDA,AKIAkY,AlBEA,CaNC,AbMA,CYPC,ADHAlF,AlBEA,CKGCjS,AcFAiR,AHAA,APIA,COJCzP,AhBDAtC,ASKAmD,CFGC,CAAC,CWVC,AFGA,APIA,CJFC,AaLAY,AOQA,ATLA,APIA9D,CJFCmH,AeDA,AKIAtE,CLJC,AXGA,CSPC,ATOA,CUJC,CDHC,COQC,CpBHC,AoBGAmO,AzBNA,CKGC1J,CLHC,EyBME,ATLA,CSKC,ATLA,CSKC,CpBHC;AmBG/C,EQLE,AnBGA,ASCAuP,ADDA,AdKA,AQTA,AQMA,AtBNA,E8BEE,ApBEA,AeAA,AdCA,AQFAX,AOJAvS,ArBEA,AUCA,AhBDA,C+BCC,ALEA,ApBHA,CIECsB,AqBDA,ALEA,AGCA,AfAA,ARJA,AYFA4N,AOQAlQ,CERC,CdKCwJ,AFAA,AMFA,AZEAtF,AOCA+F,AQFA,AOJAqC,ChBKCzJ,ASDApD,AGGA+U,CbHC,AmBEA,A7BJAnX,CUECiE,AmBEAuB,CjBAC,AMNA,AlBEA,CsBICqR,CAAA,CjBDE,ALHAzX,CUEC,ACCA,ANAA,AiBCA,CXDCwB,ACCA,AWCAuW,CVFChL,AgBCA,ATFA,AGGD,CbHExJ,AGCA+B,AgBCAiM,ATFAN,CfCC,AkBEA,ClBFC5J,AOCA,CAACgG,CeNC,CEMC,AFNAoC,AFQV,CZHW,AgBCA,ATFA,AOJA,AFQVhL,AzBNU,C6BIC,ATFA,AOJAD,A3BEA3D,CaGC,GcLG,A3BEA,C2BFC,AFQV,AzBNUC,CyBMT2C,CdHW,ANAA,AOCA,CDDC,ANAA,COCC,AQFA,CAAC,CVAT,AeIA,CfJCkB,AeIA,EzBNY,CAAClE,IWGI,CDDT,CAAC,ACCU,CDDT,AVFU,CAAC,CAAC,CWGC,CAACkM,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AaE1EtJ,EQHC9C,ANEA,ANDA,AOJA,ANMAyW,AdKA,EGPE,AqBDA,AlBEA,AFAA,AkBCA,AVHA,AGGA,AhBJA,AmBMA,ATLA,AhBDA,ASKA,AcAA,CECC,CpBHC,ASCA,AFAA,AMNAtD,AOQA,CpBHC,AmBCN,COHO,ApBEA,AMFA1S,AOGPmX,ARHO,AhBDA,C+BCC3L,ApBEArG,AKFAqG,AhBDA/L,CaGCgL,ACCA4D,AFAAxB,CUAC,ACCA+J,CFDCZ,AHNA,CcGCzW,AXGD,ArBJC,CgCCA,AlBGC,AINA,CIMC,ADAA,AdKA0I,CyBRC,ArBEA,AMFA,AKGAqD,AtBJA7L,CWGCc,AMFAN,AHGA,ASCA,CCDhB,ADCiB6U,ELPE,AlBEA,CiBCC,AHGAxG,AFAA,AYApB6I,CPHqBtF,CVQC5J,CKLCsE,AUAA,AfKAlD,AgBJA,CTDC,ASCAE,CTDC,CiBHC,AjBGA6E,AEHA,CeAC,AnBGA,AIHA,ATQA,AgBJA,CQJC,AnBGAtB,AIHA,AOIClJ,ChBIA8D,CiBL7B,EbDgC,AMFA,CNEC,AMFAgK,AMIC,CTDA,APKA,COLC,CPKC,CMNd,ACCe,AFAA,AWCE9N,CVFhBQ,GIFkB,CAAC,AMIE,CZFD,AYEEiF,EZFA,EYEI,CAAC,CZFD,CAACuC,IEAX,CAACvH,KFAoB,CEAd,AFAesH,CEAd,GFAkB,CAAC,IAAI,CAAC,CAAC;ASAzE,AOJA,AlBOA,EsBJE,AlBEA,AaCA4B,AGAA,APAA,ANHA,ADFA,AQMA,AtBNA,E+BEE,AtBCA,ACCA,ANAA,AcFA,AbDA,AeIA,AIEA,AzBNA,AOSA,CFNC,CAAC,AOCAhB,AMNAoG,EcGE,ArBEA,AGAgClT,AOChC,AIEA,AzBNA,AOSA,CyBRC4c,ArBEAlX,AUCA4Q,AIEA8B,AzBNA/X,AOSAmG,CGPCmE,ASDAiE,APGA,ANJA5F,CMICqE,CEDiC,CIL/B,CRIC,ASDA,ALEgC,AOChC,ArBJA,CqBIC/K,AHNA,AXWA,CyBRC,ArBEA,CDDC,ACCAxB,AQFA,AnBDC,COSA8I,CyBRC,CNGCkE,AdAA,CcACnD,APHAkE,CbDC,ACSA,CyBRCa,AtBCA,AEEA,CSAC,CKAC,APHA,AbDA9G,AeIArG,CFHC,AMKA,CfJCiI,AgBEA,APHA7J,APGA,AaEAG,CbFC6L,ASAA,CAAC,GfJG,CKGC,ALHAnE,ANAAtI,CWGC,AQFA,CAAC,AEGA,ArBJC,CqBIA,CXFL,ASDM,AnBDA,CUELiF,CsBDF,ApBGS,CoBHR,ApBGSkI,CoBHR,ArBES,ALHA,CIEL,AJFMxE,CIEL,ACCM,AcGA,CfJLY,AeIM,GdHG,CAAC2C,CCCC,CFFL,AeIM,CfJL,CAAC,AeIM,GdHG,CAACF,EcGE,CnBNC,CKGC,ALHA,CKGC,IAAI,CAAC,CAAC,QLHQ,EAAE;AcE5EtJ,AOJAA,AlBQD,EsBHEoJ,AlBEA0B,AgBCA3B,AxBFA,AiBEAC,ADDA,ALFAA,ADHArJ,AQOA,AtBPA,E+BEE,AtBCAE,ACCA,AeCA,A1BJA,AOSA,EYTmC7C,ALE0B,AFE3D,ANJA8I,AmBMAjG,CXJ4D,AMDjE,AOJA,CKIO,ADCAmJ,ApBCA,AeCA,ATHA,AHC2D,AMDlE4J,AOJAgD,ALQO5M,AJRS,AFKTA,AhBFA,AOSA,AQVArJ,CiBECka,ADCD,ApBCCnX,AeCAkS,AJCD,ANHA,AhBFCtX,AOSAwH,AQVA9G,AQOAsW,AtBPA3U,CkBCkC,APIjC,CmBFC,AnBEAgK,AUCA,ANHA,CGFkC,AJDjC,CTCC,CSDC,CTCC,ALDAhK,CUIC,AVJA3B,C+BEC,ArBGVoB,CeAW,ACPjB,A3BGiB,AOSA,CMLCsL,APJA,ALDA,C+BEC,AnBGA/C,AgBCAoB,ATJnB,CMGoB,AGCD,AFRnB6M,A3BGoBrY,AOSA0H,ANVA,CSGT,AEEU,AMPS,CRKlBtD,AmBGU,AjBDA0I,AQHtBuI,CYAuBkE,AnBGA,AKPS,AOSnB,AFAUxC,CGFCI,ADEVrT,AFAUuF,CVFC,ANKA,GPTG,AuBMA,CZFT,AXJUpJ,CWIT,AgBPpB,AJS8B,CXFC,EZJE,CYIC4M,AQHlC,IVC4B,CAACzC,AeIA,CAAC,COLC,CAAC,CAAC,AtBCA,CAACzK,AeIA,CbFW,AaEVkY,CfJC,AgBEF,ChBFG,AgBEF,EfAI,CAAC,CAClCtX,WcC8C,CAACiC,CCFD,EAAE4H,CfChC,CAAC,AcCmC,CAACuG,CCFD,CAAC/M,EDEI,CAAC,CdDlC,AcCmC,CCFD,ADEE,CdDlC,AeDiC,IfC7B,CAACmH,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;AFC5D,EEAE,ANDA,AgBCAsK,EWJE,AtBCA3R,AqBAA,AlBEA,AaAA,AGCAA,AVNqD,AGMrD,AGCA,ATJA,AhBFA,AOSA,AQVA,AQOA,AtBPA,CkBAsD,AMOrD,CNPsD,ALGrD,AFEAtD,ANJAwH,AYJ8C,AOU9C,CPV+C,CcK7C,AnBGA,AaAA,ATHAlJ,AZGA4H,AiBCA,ANHA,AhBFA,AOSA,AQVA,AdAA,C+BECqV,AnBGA/O,AaAA6J,AJCAtX,ANHAsL,AhBFAnL,AOSA8G,COPCvD,CPOC,AgBHAmT,CFDCX,CPHC,AFEA,ASCD,CTDExU,ALKA,CcJC,CXHN,AmBGA,AfHO6B,CJANqB,AmBGAJ,AbHO,AhBFA,AuBMA,CSLC,ANGA,AJCA,ANHAkH,ATOAzF,AgBHA8O,CVFC,AaAAjJ,ArBAA3E,ASFA,AFEA,AUCA4F,AhBLA,COIC1C,ARAA7C,ASFAgH,AFEA,AZJAvO,CgCCC,AtBCP,AJFO,CIEN,CmBGC,ChBDQ,AgBCP,AbHO,AOIA,CSLC8R,AhBCA,AOIAkF,CVFC,AaAA,AVFA,CUEC,CJCC,AtBLA,CKIC,ALJA7W,AuBMA,CVFC,ADAA,AWECyD,CVFA,ARAA4D,AOAA,AUCA,EIDG5D,AJCD,CAAC,CZHN,ALEO,ASFA,AQGA,ACCC,CTJAyK,APOV,CGPIjE,AmBGA,AxBDO,AEKVf,CmBLY,ATHjB,CYIU,AZJTzI,AMKkBgD,CTJD,CJAN,AIAO,APOV,CGPI,AgBES,CGCR,AZJT,AjBDgB,AOSV,CsBJIwJ,AZJT,AjBDgB,AOSV1F,AgBHY,CSLZ,ATKa2B,CSLZ,CAAC,EzBQG,AgBHY,ChBGX,EAAErB,EgBHcqB,IAAI,CAAC,EMDP,CAACsC,IAAI,CAAC,A7BLO,CAAC,CAACvL,CiBCf,CYIU,AZJT,CYIU,AZJTV,CYIU,CtBId,CAAC,CPTuB,OiBCT,CAAC,CAAC;ARKrE,EIDE,AFEAgM,AKJA,AOIA,ESLE,AtBCApH,AqBAA,AFGAA,AxBDA,AOAA,AUCA,AhBLA,AeKA,AICA,AzBNA,AOSA,CDTC,CoBIC8F,ATHA,AHEA,ARHA,AYJAnK,AHGAyC,AdAAA,E+BEE,ADCA,AVGA,AICA,AzBNA,CgCCC8Z,ADCAzD,AVGAhD,AICA+B,AzBNAzX,C0BIC,AZDAmO,AQEAiI,AJTA,AXaA,CmBLC7S,ArBAA,ASDA,CQEC,AJTAhE,CPUC8L,CAAA,AGHC1L,AOEA,AdIA,CFLC,AiBCAA,ADAA+B,AdIAiF,CGPN,ACIO,AeFA,AGCP,AxBDOZ,AaRA,CRMNzB,AmBGAJ,AXTO1E,AXaA,CAACwG,AQVA,AdAA,CyBKCzC,AXLAV,AdAAA,C8BGC,CrBAN,AqBAOuO,CrBAN,AICO,APMA,CyBRC,AHIP,AfFOhD,AQEA,AfIA,CmBLC,AGCP,APAOA,ADAA,AdIA,CcJCrM,CWJC,AdLA,CAACwC,CbQC,ALJA,CKKrBsC,AoBCsB,AzBNA,AeDA,AdAA,C+BECuQ,ADCA,ANIAlX,AzBNA,AeDAE,AdAAA,CoBMC,AHTA,CGSC,CUHC,AhBHA,AdAA,CcAC,AdAA,C8BGC,CrBAN,AICO,CAAC,AQEA,CZHN2J,AmBGA,APAO,ADAA,CAAC,CQAN,AxBAf,ASFsB,CTErB,ASFsB,CJDN,ALGf7C,AiBAsB,CZHN,AYGO,COAN,CAACgG,CJCQ,CAAC,IpBDlB,CAAC,CoBCuB,CpBDrB/F,CoBCuB,GpBDnB,CAAC,C2BJO,A3BKrCC,C2BLsC,APKgB,COLf,CHIU,CAACkE,IAAI,CAAC,ExBC5C,CAACpE,CwBD+C,CAAC,CAAC,MxBCxC,CAAC;AIA7B,AcCA,EVDE6F,ARCA,AOFA,ASCA,ALFA5B,ATMA,EyBRE,AtBCA,AqBAA,ApBIA,AkBDA,AZJA,AEFA,AGMAiL,AhBLAhO,AYJA,AlBIA,AeDA,AdAA,CgBEC,ACLA,AHGA,AdAA,CyBKC,ATHA,AHEA+F,AQEA,AJTA,AOUA,AVPA,AdAA,CaIC,AQEAzM,CUJC,ArBKA,AkBDA,AfFAwB,AdHA7D,CgCCC+c,ArBKAtX,AkBDAA,EnBHEiF,CgBECA,AZDA,AWGA5H,CVPCI,AdAAA,CcAC,AdAA,CSGC,AICAa,CHGC,AeFA,AGCA,APAA,AhBLA,ASDA,AdAA,CUOC1B,AeFAoH,AGCA5I,APAAyB,AhBLA0G,AmBMA,CXHC,CDEC0E,AbLA,CaKChD,ASAA,AGCA,ATHAoB,CUCC,AJCA,ANFD,AhBHC,C0BIC,CAAC,AVDA,CHEC,AYCA,CAACsM,CZDC,AFCA,CqBLC,ArBKA9V,AWDA,CAAC,AhBLA,CAAC,C0BCC,ArBKA,CAAC,EkBDE,CGJCoW,AHIA,IlBCI,ALNA,CKMC,CkBDC,AvBLA,EuBKE,GJCG,CIDC,AJCA5V,CIDCoW,CvBLC,EAAE,CmBMC,CAACjI,IAAI,CIDC,AJCA,CIDChF,AJCA,IIDI,CAAC,IAAI,CAAC,CAAC,GGJjB,CAAC,CAAC;AXKtD,AZAA,AcACtJ,EbHC,ACIA,AMLA,AZMA,AOFAsK,ALKA,EyBTE,ADCA,AlBGA,AaDA,AGCA,AVNA,AGMA,AJRA,AFMArI,CUCC,CAAC,AZDAkK,ARJ8C7F,AmBO9C,AzBNA,AeDA3H,AdAAA,CaIC,ASEN,CSJO,ADCA,AlBGA,AgBAA,AxBEAgB,ASJA0M,AQEA,AJRA,AKQPkI,CSJQ8F,ADCAtS,AFGAjF,APAAiR,AJRAhE,CCEC5D,AMOAhM,AzBNA,CKOCR,AcRA,AnBCAtC,CaKC,AREA6H,ACR8C,CyBG7C,AlBGA6C,AENA,AdAA,CkBACpK,AGMA,AhBN8C,ASA9CiB,AQMb,AtBNaA,C8BGCkJ,AnBGAwC,AUAAL,AGCA,AlBIApF,CsBLC,AfFA,AFED,AIFN,CHEQ,AgBAA3G,AXRA,AFMPgE,AOETqS,CXAiB,AMRAhE,CLQCjT,ACFA,ACJA,AdAA,CiBFC,AOSA,AVPA,AdAA,CYMC,AREA,CcRC,AGMA,AJRA,AOSA,AzBNA,CgCCC,A3BMAiF,AcRA6J,AGMClC,ANFR,AhBHO,AuBKtB,CECuB,ATHP,AhBHO,EgCCE,ADCA,AlBGAnC,ANKAlD,CwBRC,A1BKA,AiBFC,AfKDM,CwBRC,C1BKC,C2BNCwN,ADCA9H,AlBGA,CAACvN,ACFA,AQEE,AfKF,EMLE,AgBAA,AtBKA,CwBRC,AFGA,CEHEgK,AlBGD,CMNC,CAAC,CHIN,EGJS,AHIP,CGJQ,EYGG,CFGA,AbFP,CAAC4D,CaES3K,CEHE,AFGD,IAAK,GdNC,AdAA,EcAEA,AdAAA,CcAC,AdAA,CcAC,AdAA,E+BEd,CAAC,CAAC,ChBEU,CAAC;ACDzD,AIGCP,EXDC,ACIAuJ,AeHA,EMHE,A3BMA,AcRA4C,APMA,ANP8D,AUK9D,AhBHA,AOUA,AQXA,AdAA,CkBAC,AbD8D,CyBI7D7E,AlBGA,AgBAA,AVNApG,ALIAiL,AQEA,AhBP8D,AYD9D,CJMC,AOCN,CWHO,AlBEAG,AFEA,ASDPmH,AIEO,ATHA,CgBFCiF,ApBIA3O,AIFAoD,CHEC,AgBAA5M,AxBEA8E,AcRA,CNMC0C,AgBAA,AtBKA,CIHCwB,AkBFAnL,APAAiW,AJRA,CPUA,AQRCpT,ALIA,AOCZ,CUFa,AjBCA,AQEA,CZFCuH,AqBDAyB,AlBGA,AFEA,AkBFA,AxBEA,ASJA,CKJC,AEKfwJ,AHPexP,CCECiI,AGMAvO,AfKA,CMLC,AREA,C2BNC,CHIC,AjBAA,CSDnB,AHPoB,AFMA,ATOA,CyBTC,ADCA,AlBGA,AKRC,AFMDO,ATOAyG,CwBRExH,AnBGD,CPEC,AEGA,CeLC,AJRAiE,AXaAyD,CyBTCmK,AVIA5C,COAC,AjBAA,CPEC,AaVC,CWQA,AxBEAvH,C0BLE,ErBCC2D,ASJA,CTICC,ASJAuD,CYGG,ExBQA,CYXC,AZWA,CYXC,AHIA,CMEC,ANFA,CXIC,AiBFA,CjBEC9G,AEGA,CGPC,AHOAA,EGPE,AYEA,CAAC,CNFC,EgBFV,AhBEY,CgBFX,CAAC,A3BMY,CaVC6K,AXaA,CFHC,AWJA,CAACxC,ATOApI,IAAI,CAAC,CWbC,CAACqL,GbUG,CAAC,CWJC,CENE,AFMDlH,EENE,CAAC,CFMC,CAAC,IAAI,CAAC,CAAC;AUE7E,ATJCtJ,ELKC,ANPA,ANEA,AOUA,AQXA,AdAA,E+BEE,AtBEA/C,AGEA,AFEA,ANAA,AcRAkP,ADFA,AFMA,APEA,CUNC,CAACE,ALIApL,AQEAoT,AGCA,CRNL,CeCO,ADCA,ApBKA,AkBFA9T,AZLPyO,AKKO,ANFA,CgBFCsE,ArBMAxQ,AkBFA,AfFA,AQEApD,ANFA4N,CaEC/C,AfFAgC,CTIC,AIFAxE,CsBHC,CAAC0P,CZHC,CdQC,AIFA,CEEC,ANAAnS,CMAC5F,AQRAqT,CFChB,AKKiB,CAACpT,CNFC,CgBFC,AfDpBqP,ADGoB9Q,CMEC,CAAC,CUJC,AHIA,CAAC,AVNA,ALIA,CHIC,AkBFA,AfFAkD,CHICrB,CqBNCiT,CDCC,A1BKA,ASJA,CiBDC7V,A1BKA,ASJA,CGH7B,ENOgC,CDJf,ACIgB,AWFA,CZFfoB,ALIgB,AiBFA,ESHE,A1BKA8G,AWJA,CeDC,AfEhC,CNDiB,CAAC,CCIiB,CAAC,ANAA,CAAC1F,GAAG,CAAC4C,CWH/B,EACV,CXE6C,CAAC,CAAC,C2BNb,AhBIlCa,CgBJmC,CAAC,CtBED,CAAC,CAAC/F,WAAW,CAAC,CAAC,AME1C,EAAC,IAAI,CAACmQ,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AUFJtJ,AdED,ANPA,ASCA,EJQE,ANAA,ALNAhC,AOUA,AENA,ARLA,E+BCE,AtBEA,AGEA,ACFA,AILA,AFQA,CFHC,CiBDC,ATGA,AGCA,CMJC,ALCN,CMFO,ADCA,AlBGA,AaFP+X,AGEO,AbCA,ATKAlR,CyBVCyV,AnBIAxX,AGCAwK,AfNAxM,CSGC3D,AYEA+M,AGCA,CPRC6F,CWOC,CAACjN,CPAC,CrBLChC,CYKC,AZLAC,CSGC,AGEAvB,ESAE,AJPA,AXaAqF,ANXA,CSGC,AmBEA,AbCA,ATKAM,CsBNCqR,AbCAtY,AhBLAF,ACDA,CDCA,CsBIE,CAACiL,AtBJA,AOUA,CsBNC,CnBFCxB,AgBAzB,AGEyB,AtBMA,CyBVC,AHIA,CGJC,CAAC,ANE5BsO,CbE6B,CAAE,CSAA,EAAE,GNCG,CAC/B,CHFiChO,IAAI,CAACzK,CGE/B,CHFkC,CaF9C,AVKK,CHH0C,CAAC,CHFZ,CAACkD,AGEaT,AGG7CqD,GNLmC,CAACqF,EGEe,CAAC,CAAC,KHFR,CAAC,IMKtC,EAAC,IAAI,CAAC+E,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AJJJtJ,ANPAA,ASCAA,EFOC,AFGAwJ,ANAA,AaVA,ATQA,EuBLE,AtBEArM,AqBDA,AZHA,ALKAkH,AEKA,AhBRApG,AOUA,ANXA,C8BEC,CAAC,AFGA,CjBDL,ANPA,ASCA,CiBGO,A3BOAuC,AOJPmJ,AUCO0K,AhBRP1O,AmBSO,ATGA,ADXP8G,AdEO,C+BCCtD,ArBOAK,AKCAwD,CLDA,AWHC,AtBJA,CUEC,ALKAxM,ASJA,AQCAd,AtBJAxB,AOUA,CGRCsH,ACKA,ANAAN,ASJAV,EWEEoR,ChBACpQ,EFKE,CGRC,AJNjB,CIMkB,AICA,AFAlB,CFDmB,AYEA,APPnB,CVUoB,AiBHA7F,AhBRpBgG,ACcoB,AELAH,CKFC,AFArBmE,AIKqB,ATEAzM,AELAI,CJECA,AWCAY,ADXtBuO,COOuB,AbCA,CJEC,AiBHA,AGCA,ChBAC,CuBLC,A3BOA,ALPA,CgCAC,APKAlP,AzBLA,CgCAC,E1BJ5B,CQO+BY,AWEA,CbF/B,AaEgCyC,AlBKA,CAACiE,CeNC,APPlC,COOmC,CRDC,AdHA,CyBKC,CXFC,AWEA1E,ATGA,AhBRChC,CgBQA,ISHI,AzBLC,CyBKA,AlBKA,CAACgH,CSFC,ChBRG,CgBQD,CTEC,CAAC,ESFE,CAACsI,aAAa,CAACnE,IAAI,CAAC,IAAI,CAAC,CAAC;ENL7E,AGGA0B,AKPA,AXYA,EyBVE,ADCA,ApBMA,AkBHA,AxBGA,AcTArN,AHUA,APHA,CoBDC,CAAC,AfDAgB,AQCA,AtBJA,ACDA,E+BCE,ADCA,ApBMA,AOTAsR,AOOA,ATGA,CgBRCsK,ADCA7C,ApBMA1O,AKCAiE,CXDC5H,ALPAlH,EmBFE,AlBCA6C,CkBDCpD,ALKA,CAACgB,AWEAiX,CpBEC,ALPA,CAACzX,CWOC,AQTA,CRSCqL,ANAA,AcTA3J,CLKC,AdHA,ACDA,C8BEC,AlBIAkL,ACFA,AEKA,CePC,AlBID,AGGC9M,CePC,AbHA+R,AjBCAhQ,CYMC,AKPAoE,CbSC,AoBFA,AzBLA,EgCAE,CAAC,APKA9G,COLC,ArBOA,ANAA,CMAC,ANAAsH,AcTA,CAACsH,ADAA,AjBCA,CkBDC,AMOA,AxBNA3L,CkBDC,ADAAuP,AOOAvS,AzBLA,CWOC,CAACuK,AXPA,ACDA,CAAC,EeSE,CLDC,AKCA,CLDCzK,CNAC,AaTA,AjBCA,CUQC,ANAA4H,AoBFA,AxBNA,CUQC,AGJA,AILA0K,AOOAgG,EXFEzX,CEKC,EAAE,EFLE,CTIC,ASJAsG,CEKC,CXDC,AaTA,AFUAiJ,CSHC,CPPCoC,COOC,CXFC,AWEA,CXFCtD,AWEA,GPPG,EbSE,AaTA,CbSC,AWCA,CAAClD,EFLE,CAAC,CEKC,CAAC,IAAI,CAAC,CAAC;ENJzE,ACIA,AkBHA,AtBOA,EyBXE,ADCA,AlBIA,AREA,AcTA6C,ALKA,AILA,AFUA,APHA,CUPC,ALKA,CKLCG,AGMA+H,ArBLA,E+BCE,ADCA,ATGA,AGCApU,ATGA,AhBRA,CgCACmJ,ADCAuN,ATGAlX,ANIAyN,CHHC9B,AKPAqF,ATOA,ARNA1P,CIQC,AcTA,CAAC,AnBEA,CmBFC,AnBEA1C,ACDA,E+BCE,AtBGAqK,ALIA,AEIAlI,AENA,ARNA,C+BCC,A3BOA8E,AaTA,ATOAE,CuBLC,AhCAA,CaKC,AbLA,AOWAhF,CWbCuP,AlBEA,AOWAzS,CePC,CSHC,AlBIA,ANMA,CwBVC2Q,AtBIA,CaDC/D,AfOA,AENA5M,COGC,CNLCoL,AGEA,AGGAxK,APHA,CCFC6J,AGEAjF,AYAV,AhBAU,CsBJC,ATGA,AJNA,AOOVlB,CMJW,AbHAhE,CaGC,A1BMA,CKJC,ALIA,EKJE,AQLA,CLOC,AKPA8S,CLOC5G,CREC,EAAEzE,IWCI,CXDC,AaTA,AFUA,CXDC7E,AaTA,CAAC,COOT,CpBEW,AoBFVoV,CpBEWtY,EAAE,AWCA,CHHC,AREA,CQFC,AREA,AWCA,IAAI,CAACqQ,CSHT,CAAC,ITGc,CAACrE,IAAI,CHHC,AGGA,CHHC,GGGG,CAAC,CAAC;EgBPxE,ADCA,ApBOAJ,AkBHAgC,AxBEA,ASJA,AEKA,ENLE,AGEAE,AMPAzN,ADAA,AXaA,EePE0W,AtBJA,EsBIE,AJNA1D,AOOA,AxBNA,CqBKCzG,CZDCnC,ACKAmB,AJGA3G,CIHA,CEHE,AMPA,AMOA,CZAC0H,AFGA,AQVArM,AGMA,AGCA6X,CfFC,AHQA,CGRCjQ,ATJA,CqBKC0E,CHNC,AZaA,CYbCsF,CDAC,AjBCAvO,CYMC,AgBAAiK,APDA,CZDC,AGECpI,AgBADiF,CnBFC,AQLA,AjBCA,CSIC,AHQA,ANZAhH,CiBDC,CWOC,C5BNC,C4BMC,AtBMA,CMNE,ANMD4D,ANZA3D,CkBDC,CAACmL,AZaA,CYbC,AZaA3L,CMNGsC,AMPF,CMOC,CAAC3C,AlBMA,CAAC,ANZA,CAAC,CAACe,EYMI,AYAF,AlBMA,CMNGnB,ANMFmF,CNZC,CwBMC2Q,IZAM,CAAC,CAAC,CAAC,ANMF,EAAEvY,CkBNC,ClBMC,CAAC;EyBTpDgd,ADCAnR,AlBGA,ARGA,ASJA,EJDE,ACKA,AkBHA,AXPA,AlBEA,AOWA,AENA,CTLC,CsBICkL,AtBJA,ACDA,CAAC,CSICpU,AmBEA,AxBGAsF,ASJAuG,AQAA,AJNA8E,AOOA,CIAC7I,APDA7J,CXICwL,CNACnE,AEGA,CFHCL,AoBHA,CIAC,AJAAuQ,AxBNA,EMYE,CsBNC1N,GlBGG,AJGA,CyBVCuS,ADCAnR,AFGA,AtBMA5G,CyBVA,ADCA,A1BMC,AaVA,CPUC,CqBPC,ADCA,A1BMAA,CaVC,AXaA,CePC,AfOA,CGRT,ACKU,AGJAuJ,AQAA,CZDThK,ACKU/D,ANAA,ASJD,ETIG,ASJA,AINA,IIMI,AGCA,CdGC,AcHA2B,CdGCF,AWJA,MAAM,EZDR,AeEU,CfFT,AeEUO,CfFT,GCKa,CAAC,CDLTgI,AeEU,CAAC,GfFP,CAACzK,EAAE,CeEW,CfFT,AeEU,GdGG,CAAC;EED7D2N,AGEA,AhBRA,AOWA,EyBVE,ADCAhJ,ApBMAyH,AkBHA,AxBGA,AcVA,ALMA,AILA,ATMA,ECFEzJ,AeEA,CAAC,CIAC,APDA,AGCA,AxBNA,C4BMCiJ,CxBGC7D,ASJAhB,ALCAiD,CSNC,CIKC,AJLAsJ,CPSC,AWJAsD,CXICzU,CNAC,AoBHAb,AxBNAoC,C8BGN,CAACkB,AFGO,AfDA,CeCC6F,AxBGA,AIHA,CICCkD,CAAClD,ACFA,AWCA,ChBAC,CoBAC,AJAA,AxBNA,C8BGN,AFGOQ,CnBFT,AqBDG,AlBIO,AREA,AiBJA,CZDTxG,ACKU,AWJAmI,AJLA,CLOC,ACFAzC,CILC,ATMAA,CEGC,AkBHA,AxBGA,CwBHC,AxBGA5C,AiBJA,CAAC,EXIE,CAACkD,IAAI,CoBNN,ApBMOQ,EoBNL,A1BMO,CKLT,ALKUrD,CKLT,CCKW,CoBNN,CAACgG,CrBCF,CAAC,GLKa,ASJb,CAAC3D,ALCA,CJGc,AIHbG,KKDK,CAAC,CAAC,IiBFU,A1BMO,C0BNN4B,A1BMO,EIHX,CAAChM,CsBHO,CAAC,AtBGN,CAAC,GsBHS,CAAC,CAAC;EpBOlE,AkBHA,AbGA4N,AhBPA7N,AOWA,EyBXE,AtBEA,AqBDA4E,AlBIA,AREA,AcVAhB,ALOAoD,ALAA,ESNE,AjBAA,CkBDC,CaGC,AbHAkI,AGMA,AGCA,COJCsK,AvBIA,CICCxL,CREC,ASHA,CAACpG,AQDA,AJLA,AOMArG,CzBJCvB,CAAA,CKOE,AEIAqI,AEPAvI,CsBHN,A1BMOmI,AiBJA,AtBHA,C+BCNpD,ATEO8R,AGCA,CAAChN,EOJE,AhBOA,ATIAtB,CMNC,ACDA,APOD,CkBPE,AhBAA,CuBJC/H,ADCP,AZJO,AHUCoK,ATID,CwBVN,AlBIO,AMRAoE,ALOA,CKPC,CAACjL,AVOAoG,CgBAC,ATGC,CHFA,CAACxE,AREA,AiBJA,CjBIC,AcVA,CaGC,AbHA,AGMA,ANIE,CgBPDhF,EvBIE,CJGC,CQFC,ACDA,ALAA,CsBHN,AlBIO0B,AREA6F,E0BNL,CNGQ,EpBGE,AoBHA,CMHN,A1BMOE,C0BNNwF,ECDS,A3BOA,C2BPC,A3BOAxI,GQFG,CAC3C,ARC4C,CAAC,CAAC,MQDvCwF,EmBN+C,ADCP,CCDQ,ADCPuB,ClBKrC,CAAChM,EkBLwC,AlBKrC,CkBLsC,IAAI,CAAC,CAAC,OlBM9D,CAAC;EFEHoL,AkBHAqC,AxBEA,AcVA,EaGE,AtBEA9I,AqBDA,AlBMA,AGAA,AhBPA3D,AOWA,ANbA,CAAC,CaMC,ALAA,ARNA,E+BEE,ADCA,AlBMA+M,AKVMwF,CcGL8F,ADCAU,CjBGC9U,AQDA,AGCA,ATGAqL,CTIC,CIHClF,AOXM,ATONvL,CEIA,AVVCyB,CaMC,AQDA,AGCA,AzBJA,CWQC,AWLAoV,AGCAyB,AzBJA,CUEN,CAACnT,AIEO+B,APOA,CSJC,AfTA,CYSC,AgBFA0G,ApBDA,CoBCChD,ApBDAvC,ARNA,C+BEC,AtBEP,AGKO,AGAA,AhBPA,AOWA,CGTN,AHSOb,EyBXEhH,AHKA,AfDA,APOA,COPCiH,AEGA,ATIAc,CwBVC,AFIA,AbEA5C,APHA,CsBHC5E,ATEA,AbCA,CaDCgM,AbCA,EFOE,COPC,APOA,CyBXC,AVGA,CUHCpM,AVGA,ANIA,CAAC0B,CNLN,AeEO,AlBOA,CkBPCE,AlBOAwF,CGTN6C,IAAI,CAAC,CqBDQ,CACrC,CNEuC,AlBOA,CkBPCpI,AlBOA,CyBXC,AhBOA,CgBPC,AhBOC,CSHA,CAAC,CMFrC,EACP,EfIiDoI,EeJ7C,ANC+C,CMD9C4P,ANC+C,CTGC,CAACra,EAAG,CgBPA,CAAC,AhBOA,CAAC,IeJ3C,CAACgM,IAAI,CAAC,IAAI,CAC5B,CAAC;AZNL,ETKE,ALMA,AEGA,EyBXE,ADIA,ApBIAlB,AkBHA,AbEA,APHA,EIGEiD,AbPA,ACFA,E+BEE,ADIA,AFCAtD,AxBGAvC,AiBLA,AJPYrF,AOQZ,ATGAyN,CgBPC8I,ADIAY,ANAA,CzBJC,CAACjZ,C6BKC,CAACf,A5BPA,CIUCkI,CwBHC,AxBGAN,AoBJA,AzBJA,CgBOC,AhBPA,CaOC,AbPA,ACFA,CYSCzF,AGAA,EgBPE,AHKA,GGLG9B,CHKC,AxBGA,CwBHCoK,CEDC,A1BIAzK,C0BJCY,C1BIC,CQDC,AgBFA,CAACZ,AxBGA,C2BRC,CAACQ,AnBOAiK,AFCf,AkBHe,ClBGdW,CkBHgB,EhBEE,CAACH,KAAK,CkBHC,ApBIf,CoBHtB,ApBGuB,EqBRiB,CAAC,CrBQd,CAACR,EoBHrB,EACP,ApBEgC,CAAC,GoBF7B,CAAC2P,GCNkD,CAAC,ODMxC,CAACpO,IAAI,CAAC,IAAI,CAC5B,CAAC;AZVJtJ,EaIC,AtBGA,ADCA,EsBGE,AlBAA,AFCA,ANAA,ALRA,ACFA,CDEC,C6BKC,AfDA,AQDA,AJRoB,AFYpB4N,CGXL,AGOM,AJRoB,AlBKpB,C+BOC,ApBCA,AQZP+E,AGOO,CSICyE,ApBCAtU,CkBHC,AxBGAuC,AaboB,AOSpB1G,CICCuK,A7BLA,CAAC,CAAC,CgBOC,AhBPA,CUGCP,ALKA,AWDAkF,CLCC,AOboB4C,CPanB1Q,AcJA,CpBIC,AoBJAnB,CICC,CAAC,EVTnB,ADDyC,CaYnB,ApBCA,AOboBkS,AOSpB,CMGC5S,ApBCA,AkBHA,AxBGA,AoBJAU,CdIC,AkBHAwX,AVTxBzD,EDD8C,CbanB,AaboB,CRQnBhK,ALKA9D,AaboB,AOSpB,ATGA,CNJA,AeCC,ATGA,ENJE,KmBEK,CAAC,CVTrC,CYWuC,A1BCA,C0BAlC,A1BAmCK,O0BA5B,EACP,A1BD4C,EAAE,E0BC1C,CAAC0S,Q1BDoD,CAAC,K0BCvC,CAACtO,IAAI,CAAC,IAAI,CAC/B,CAAC;AtBLL,EuBHEiR,AnBMA,AFCA,AXRA,AOWA,ANbA,ESKE,AqBOA,AFLA,AxBGA,ESJE,AQDAnG,AJRA,EaeE,ATPA,AGCA,ATGAtG,CeGCyJ,ATPAzX,CZACkC,AICA+J,AITA8E,CbaC,GabG,CbaC,CKLC,ALKAvL,AabA,AFYA,EFHE,AEGA,CgBNCiV,AtBEA,CsBFA,AVEC,CRCChd,AQDA8W,CUFC,CtBEC,AYAA,CZACvS,AYAA,CSOC,AjBNA,CiBMC5D,AjBNAV,AEGA,GXCG,CAAC,KSJK,CAAC+E,ETIE,EKLE,ALKA8C,ASJA,CJDC,CAAC,AqBOA,AjBNA,CiBOpC,AjBPqC,CAAC,CTIC,CAACG,I0BGjC,EACP,A1BJ8C,CAAClI,EAAE,C0BI7C,A1BJ8C,C0BI7Cua,A1BJ8C,gB0BI9B,CAACvO,IAAI,CAAC,IAAI,CACjC,CAAC;ApBJL,AFLCtJ,EIKCkL,AgBHA,AxBGA,ALPA,AOUA,ANZA,E+BEE,AtBEA,AqBUA,ATVA,CAAC,CAAC,AGCA,ChBDL,CCAOlJ,AqBUA,AblBA8N,AFYA/B,APJPnG,CsBUQ4P,A/BZAjZ,ACFA4C,C+BECqZ,EvBET,CuBFY,AhBMA,AhBNAjc,CUEC,AQRA,AlBMApB,CkBNCkH,AFYA,ATIAoB,AERdmC,ARJczG,C+BEE,AtBED,ATJAC,GQIf,ARJkB,CYSC8J,CAACnD,AbPA,AOUAtC,ANZA,CiBJC,AFYA,ATID,CPVErI,CkBNC2S,AXgBA,CwBEC,AlBLA,CkBKC7R,ClBLC,AbPA,EAAE,GkBNG,CAAC,SakBS,CAAC,OAAO,EAAE,MAAM;ACX1D,ArBMC8B,EkBDC,AxBGA,EQDE,ASLA,AGCA,AzBHA,AOUA,ANZAC,CwBKC,CfDC,AqBUA+V,AjBTA,AWAA,CdGL,CECO,AFDPjN,AkBDOwN,AxBGA9Q,AiBNA,AJRAmL,AFWgB,CMHflT,CtBFCc,AOUAyI,EMHE,AZTA,CSIC,AGKAc,AZTA7H,CIUCuF,C2BRCxF,A3BQAiF,CJVC,CYSC,ANGA,ANZA,C4BOCqR,APHA,CZAC3O,AGKA,AgBFD,APHC9H,CXIlB,AJImB,CsBLC,AXXA,ClBMC,ACFA,CUQrBiJ,CNEuB,AadA,AjBIA3H,CDEC,CKQC,AEEA,CNZC,C8BcX,AblBY,AjBIA,CSIL,AqBUNyK,A/BZY5O,CUELuD,AYAM,AfQA,CeRC4T,AfQAzP,EyBVR,AtBEI,AYAM,AfQA,CyBVTtD,AtBEIW,AYAM,AfQAyD,CIJjC,IoBM0B,CrBVO,AqBUN,AxBFY,CGRL,AHQM,CyBVT,CAAC,AhCAU,CgCAR,ADYH,A/BZYtI,C+BYX4K,AxBFY,CAAC7C,GwBET,EAAG,A/BZW,EAAE9H,EOUE,CAAC,CPVC,CAAC,C+BYX,IAAI,CAAC2K,IAAI,CAACzK,EAAG,OAAM,CAAC;ACXnE,EVEE,ArBJA,ESIE,AqBUA,AFPA,AxBGA,AoBLA,AzBHAkB,AOUA,CwBEC,CAAC,AlBLA,ACJA,EeEE+J,AXXA,AOSA,ATEAyF,CSFCgH,CpBKC3P,ASLA2G,CPOC/E,CMHCqE,CgBFC,CfFC,AEEA,CgBLCrL,A3BQA,CwBHC,AbAA,AhBLA,CcGC,AdHA1B,CKQC,AoBLA,AlBOA,CkBPCiL,AlBOAtC,CsBLC,CAACpE,AfFAmJ,AdHA,CAAC9O,AOUA,CAAEoF,CFFA,CSLC,AEEA,CFFC,AWAA,ATEC,CFFAwJ,AWAA,AlBOC,CsBLA,AxBGA,CwBHCtM,AxBGAoF,ALRA,CAAC,CaOC,ANGE,EyBVV,APGU,COHT/D,AnBOU,CCJC,APOE,COPD,EDIE,ACJA,CDICgC,ANGE,CyBVX,AHKU,AxBGA,AEEEP,CyBVX,AHKU+L,AxBGApJ,C2BRR,EzBUa,CsBLD,AtBKE,CMHD,AgBFA,AtBKE,CMHD1F,AgBFA,GxBGG,EAAE,QQDQ,CACnD,ERAsD,CAAC,KQAhD,IAAI,CAACuI,IAAI,CAACzK,EAAG,EACvB,CAAC;AmBRP,AVEA,EfQE,ANXA,ESGE,AqBUA,AFPA,AxBGA,ALRA,EaSE,AKfA,AOSA2C,ATEA,CAAC,CeOC,AFPAsI,AfHgCnL,AEGhC,CeOC0a,A9BbAzW,CYUCiK,CHPC,ALMA,ALRA9M,CcEiC,CeG/B,CAAC1B,AfHgC,CkBF/BmD,AtBEA,ALMA,CAACqF,CJTCjE,CAAA,E4BMG,A5BNA,G8BaG,A/BZA,CyBGT,CIEW,AJFVC,CMSW,AFPA,EAAE,ChBIC,ARDA,C0BIC,A1BJA,C0BICoV,AlBHA,EmBTR,APGA,COHC5U,APGA,IpBKc,AoBLV,CAACkT,CpBKW3P,E0BIE,CAAC7F,E1BJE,CAACiG,EoBLR,CAAC0O,COHC,CAAC,CAAE,A3BQS,CAAC,CAAC,CAAC,C0BIC,CAAC,GNTP,CAAC,CAAC,CAAC,KMSe,CAAC;ACXrE,AVCCnU,EZCC,ALMA,ALRA,E+BYE,ANTA,ATEA,AfNA,CwBIC,CIECuI,AfJ2D,AIN3D,AOQA,CXF4D,AQAjE,CTQO+C,ACR2D,AQAlEuI,GOIU,A5BNA5T,CqBEV,AJNW8Q,EWUE,CGLCxT,AVCdsW,GOIiB,CGLC,AHKAuC,APJlB,ArBFkB,C+BCC5Y,A/BDAgD,CiBJC,EjBIE,CiBJC,AjBIA,GYUG,CAACd,AKdAsR,CcKC,CAAC/Q,CHKC,A5BNA,CAAC,KYUK,CAACF,CKdC,CAAC,CAAC,CAACkR,ELcE,CAAC,GmBTP,AdLU,CcKTtP,AdLUxB,KAAK,CLcC,AKdA,CLcC,WmBTC,CAAC,CAAC,CAAE;AAC7D,CAAC,CtBGC,ALMA,AWJA,AhBJA,AOSA,ANXA,CeMC,CeOCxC,ANTA,EZME,AgBJA,AfJA,AINA,EbcE+H,AoBNA,CfAC5D,AeAAuT,AzBFA5W,C6BIC,AfJA2C,CeIC0B,CEOC,AbjBAoO,CaiBChT,A1BHAwH,ASRA,CTQCR,ESREjE,CINC,CWUC,CAACvB,AfJA,AWEA,AzBFAjB,CcACyN,AINA,AOQAhO,AzBFD,CkBNEyS,ClBMC,CKQC,EKNE7O,ALMA,CKNA,EAAG,AmBEA,CEOC,AFPAnC,CEOC,EFPE,AXVA,CWUC,EfJE,AINAoR,CJMC/E,AWEA,CAAC,EMSE,CFPC,AfJA,CiBWE7N,AFPD,AfJA,GING,AOQA,EMSG,AbjBDgT,AOQA,IMSM,ANTF,CPRC,AOQA5S,CPRC,GOQG,CPRC,AOQA+K,CPRC,GOQG,CAAC,IAAI,CAAC,CAAC;AlBQnE,ESJEiE,AfNA,E+BAE5O,AtBGA,AGMA,AgBJA,AxBIA,AoBNA,AzBFA,C6BIC,CEOC,AjBVA,AIPAgS,EOQE,CAAC+E,AxBHApU,C8BYCyW,A1BHA1S,ASPA8G,CkBFC,AtBGAlM,AmBEA,AfHA,CkBFCuC,EDYE,AjBVA7E,AEIA4P,CgBNC,A3BSA,AWHD,CgBNEiN,ADYAxC,CbjBC,AFWA,AfNA1W,CISC,AJTAC,C+BAC,CAAC,AdLA2P,EJOE,CAAC9E,AbFA,C8BYC,A1BHA,CadC,AjBKA,CiBLCgF,EbcE,AoBNA,CfAT,ALMUvM,AadA,AOQAhF,CfATW,AQRU,CAAC,ERQR,CAAC,EIDY,AWCA,CXDC,EWCE,CpBMC,ASPA,CTOC0E,ASPA,IWCI,IfAN,AeAU,CfAT,ALMU,AoBNA4Q,EpBME,WAAW,AoBNA,CpBMC,AoBNA,CAAC;AlBQjE,EyBVE,AtBGA,EGME,ARAA,AoBNA,ATGA,AhBLA,ACDA7V,E8BaE,AFRA,AfHAkM,AINA+E,CJMC,CAAChQ,AWCA,CAACtB,CMUCzB,AlBJAoN,AgBJA,AbCA8B,AhBLA3O,C6BICoE,AxBIA,AabA,CJMC,AINAmH,AjBIA,CAAC/J,E8BaE,A1BJA,ASPAkB,CiBWChD,A1BJAkH,AJTA,CAAC,C4BKC,AfHA,CiBWC,AFRA5F,AXTA,AFUA,CEVE2R,AOOD,CAACxR,CTGClC,EeOE,AlBJA,AKbC,AjBID,EAAE4D,CYSC,CgBJC,AXTE,AOOF,CIECxB,AxBIA,CAAC,AWHA,AhBLA,CaQC,AYNA,ATGAjC,AfNA,CYSCgF,AZTA,CDCCnE,E+BYE,AFRA,CAAC,CEQC,ANVA,EZME,CAACa,AbRA,CKQC,AoBNA,AzBFAZ,CyBECP,CIEC,AxBIAgH,CwBJC,CbCC,CSHC,ATGA,AhBLA,CyBEC,CpBMC,AoBNA,CpBMCK,IQAI,CAAE,ARAD,CAAC,CAAC,CAAC,CWHC,CAAC,GHGGqC,IAAI,CAACzK,EAAG,EAAC,CAAC;ANExE,EyBTE8L,AtBGA,ALKA,AoBNA,AxBHA,EYSE,AgBJA,AbCAiE,EFJElB,CAAC,CkBDC/C,ADYA2O,AlBJAxM,ACPAc,AINA,CcKA,EAAG,CDYC,CfPC,CEVCiF,AFUA5R,CNFCkJ,AqBSA,CjBXC,GiBWG,AjBXA,CiBWCkP,ElBJE,CGHC,CHGC,AGHAnK,EEVE,GRQG/E,AQRArL,CRQCwK,AMEA,CAAC,EEVE,CRQC,AqBSA,AbjBAnH,ERQE,CqBUxB,EjBZ2B,AINA,AFUA,CEVCyQ,AFUA,CeQxB,CAACyG,EblB2B,CAAC,WakBd,CAACG,kBAAkB,GACtC,IAAI,CAACvB,WAAW,CAACwB,iBAAiB;AxBJ9C,EFAE5S,AoBNA/G,AxBHA,E+BAE,AtBGA0B,AmBCA,AbCA,AhBLA,EaQEsL,ACPAY,AWEA5N,CXFC,AWED,COHE,ADcA,AjBbA+N,AINA,AFUA,CgBLC0N,APGA,ATEA1M,AfLA9L,C4BICuG,EEUEgQ,AbnBA1G,CJMC,CeGC,AfHA,CTQC/L,ASRA,CkBDC,ADcA,A1BLAlI,AadA,CcKCgM,AHIA,AXTAkF,CamBC,ElBNE,ARCA,AWJA,CHGC5O,AKbA,AFUAuO,CNFT,ALMU5J,AadA,CcKC,AtBGVtC,AmBCUqG,AXTA,CcKC,A/BAA5G,C+BAC,AdLA,AjBKD,CeKE,CAAC,AfLA,CeKC,CXIC,CQDC,CAAC7B,ARCA,GQDG,CAAC,IHLN,CAACoI,IAAI,CAACzK,AGKU,CAAC,CHLT,CAAC,GmBCF,CAACqL,cAAc,CAAC,CAAC;AtBMrD,ESJE,EgBLE,AtBGA1G,AGKA,AgBJA,AxBKA,AoBNAsS,AzBHA5V,ACAA,EaCEsC,EkBDE,AHIA8G,CGJCkS,AlBCA,CiBaC,AjBbA1N,AINA,CbcC,ALTA,ACAAtM,C4BIC,A7BJArB,E+BcE,AFVA,CxBKCsF,CKNN,CsBHQ,AtBGP5B,AVHO,CgCAC8G,ADcA,ANXR,CMWS0O,ANXRtD,AxBHQ,CDAC,ACAAhU,CSGN,CAAC,ALMO,CAAC,AoBNR,AxBHQ,C+BAC,A3BSA2D,AoBNR,AxBHQ,C+BAC,AlBCA,AWER,COHS,AlBCA/C,GAAG,CAAC,CTQC,CLTQ,C+BcN,A1BLAgD,E0BMrB,CrBZiB,EAAE2D,CqBYf,A1BNuB,AJTA,C8BetB+P,A9BfuB,ESGL,CAAC,CLMQ,U0BMb,CAACpY,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;ECdvD,AtBGA,AMGAyN,ATGA,ANTA,EYQE,ACPA,AWEA,CXFC,CeGC,AxBKAnJ,ALViC,EyBI/B,CAACsP,CMYCoE,AbpBA,EWSE3P,CxBKC,C0BMC,A1BNAnD,AadA,CaoBCvF,AbpBA6R,AFWA/D,AhBPwB3O,AOUxBsI,CSHA,EAAG,CSHC,AzBJoB,CyBInB,CAAC,CzBJkBrI,CKUhB,C0BMC,CAACa,C1BNC,E0BME,CAAC,E/BhBU,CKUPwE,ALVOrH,CkBJN,AXcAqK,CWdCmK,AXcAlK,EwBME,CAAC,C/BhBE,CKUA,CwBLd,AxBKe/C,ALVPtF,C6BKPsJ,EtBKiB,CPVN,COUQ/K,CWdC,CbcC,AadA,AXcA,CFACsH,CEAC,EsBLb,A7BLC5F,C6BKA+I,ExBKiB,CAAC,CwBLd,A7BLJ,CAAAlJ,C6BKM,G7BLN,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;EgCGnCkK,AtBGA,AeDA,AxBFA,EYOE,ACNA9E,AEIA,ATGA,EFCEA,EQFE,AgBLqCkE,A7BLZxJ,CaUxBgJ,AZPAtG,C8BcC,AbpBAmO,CJOC,CAACpL,AdJyB,CaUxB,AREA,AWJA0J,AhBRwBjP,C+BiBvB,A1BLAuF,CKNCzC,AqBWA+V,ClBPC/P,CbVqB,EcIlB,CkBDCoB,AnBOA,AKbA,CcMA,A3BSC,AafA9E,AlBGgBvF,CcIf,CkBDC,C3BSEX,AJTDsD,CeKCyM,AfLAxM,CeKCyM,EEXE,CaoBC,A1BLC,CafAmD,AlBGO,CUMNvP,AVNM9C,CUML+C,AqBWA+V,AjBbA5Z,AEIA,CXIG,CWJD,ChBRG,C+BiBD,CAAC,AjBbA,AbDA,CSGC,AqBWA,CjBbC,AbDA,CSGC,EQTE,CAAChB,OAAO,CAACY,OAAO,CAAC;ELczD,AYJA+X,EOHE7T,AtBGA,AHKA,ANRA,E4BC+C,AfA7CtD,AEIA,AhBT+B,C6BKe,CAAC,AxBQ7C,AafA,AjBMA+C,ESGEqG,AqBWA,AxBNAlD,GOPG,AEIAsJ,CNFC,AqBWA,A1BLAvP,ASRAA,CiBaCkZ,ANXAhC,COHN,APGM,COHL5T,AtBGO,CeAC,CpBMC,ASRA,AEIA,CFJC,AEIAkM,AfLA,CMQC,CFCE,C2BTP,AtBGOxG,CsBHN,AzBQO,CNRC,EeKE,AfLA,CeKC,CeSC,A9BdA,C8BcCiG,AxBNA,GGLH,CAACrN,ALMMpD,AEDA,CAACyH,EGLJ,CsBHA,AtBGC7C,ALMO,E2BTN,ElBCS,EkBDL,AtBGC,AqBWM,AjBbA7D,CkBDN+M,AtBGC,AqBWM,CxBNC,CAAC,EOPE,AEIA,CFJCzG,CEIC,KFJK,CAAC+H,AEIA,ATGA,CSHC,ATGA,CSHC,CXICrO,AWJA,GgBLJ,CAAC,C3BSQ,CAACsG,ASRA,CAAC,KTQK,CAAC7F,KAAK,CAACzB,OAAQ,EAAC;EQAtFiM,EmBRE,AtBGA,AmBFA,AfAA,AWEA,ATEA,CaJC,AfAA,CIPC,AlBEAnM,ACIAyE,CiBNC,CRSCqG,AGKAqB,ARCAhF,AafA,AOSA,CZKA,AYLCmQ,EZKE,AgBPA,CnBEC,AqBWAzG,ErBXE,ALMA,CAAC,GJTG,CISC7J,C0BKC,A/BlBA,CAAC1F,ACIA,C8BcC,CNXP,CpBMS,AoBNRuC,CpBMSvD,ALbA,ACIA,CDJCwB,GKaG,C0BKC,A1BLAvB,AoBNR,AzBPQ,CyBOP,AzBPQ,CyBOP,EAAE,KpBMa,CAACoB,KAAK,CAAC,CAAC,CAAC;ESP9C,EkBDE,AnBQA,AKdA,AFWA,ATGA,ANRA,ESGE,AmBFA,AxBQA,AoBNA3B,AzBPA,CKaC,C2BTC,CAAC4Z,CnBQCrL,AGHA6C,ENFE,AqBWAN,AFbA3F,GbIG,CNFC,CAACQ,AqBWA,CfTCsF,CeSC,CCdC,CAAChQ,EnBQE,GAAGkK,IGHI,CNFC,AMEA,CNFCL,GMEG,CNFC,AeAhB,ATEgBuF,CgBLC,AtBGA,AeAhB/O,COHiB,EHCb,CAAC+J,AJED,CAAC,GOHmB,EAAE,AhBKA,CAACnI,GgBLG,AHCf,CGDgBsa,AHCf,CbIgB,CHGd,AGHenM,CHGdxM,GGHkB,CAAC,CAAC,CAAC,CAACsM,CgBLC,CAAC9E,IAAI,CAAC,AhBKA,CAC/D,CHEkD,CAAC,CmBRgB,AnBQf,CmBRgB,CAAC,ChBM/D,EACN,IACF,CAAC,WSLyE,CAAC;AXD/E,IkBDI,AtBGA,AGKA,ARCA,AadA,AOQA,ATKA,ATAA,ANRArJ,CISC,AoBNA,CpBMC,ALbAvB,EgCIE,AnBQA,AgBR+B6J,AXL/BoI,CcKCgG,AnBQA7T,CkBMC,AfNAyL,ATAAlH,CwBMC,ANXA,CMWC,A9BdA,C8BcC,A9BdAnH,C8BcC,CxBNC,CMAC,AZRA,CYQCuK,AZRA,CMQC5F,CWbC,CAACyJ,CcKC,CAACpQ,AhBQA,EEbE,CAAC,AFaAmQ,CHAC,AKbA,AlBCA,CAACnP,CkBDC,CLaC,ANAA,CSAC,ATAAmI,CMAC,AGAAvK,ChBZC,ACIA,CDJC6B,CCIC+C,CMQC,CAAC0F,CSAC,CgBRC,CAChC,ChBOkC,AhBZA,CgBYC,CAAC,AhBZArI,CgBYC,ETAE,CPZC,AOYA,ANRA,CDJC,ACIA,E+BC/B,EACV,IAAI,CAAC2b,cAAc,CAACpR,IAAI,CAAC,IAAI,CAC/B,CAAC;AlBFJtJ,EkBGC,AtBAA,ALMA,AJTA,EYQE4H,AGAA,AhBZA,AOYA,CPZC,C6BGwC,AXJvCgI,AOQA2E,CIJwC,AfC7C,CiBcO,AFfuC,AfC9C5I,EEQS6C,ATAAnK,IMAF,CAACoB,AGAM,CEbC,CAACpB,AXaA,CSAC,ESLN,AlBKQgD,CMAL,AYLFmN,CZKG,AGAM/F,CHAL,CAAC5D,AKbM,COQP,AlBKQ,CWbC8F,AOQR,AlBKQlL,CORzB,AWGkB,CZKG,AGAM,CHAJgG,AGAK4C,CFR5B1C,EPQ+B,CAACrO,CMAJ,AGAK,CTAC,CSAC,ATAA,CWbC,CLaH,AKbI,CFaC,CAAC,CAAC,CAAC,OFRzC;ATUD,E2BLE4N,AtBAA,AVRA,ACKA,E4BFE,AXJA,AOQA,ATKAvM,ATCA,EwBKE,AlBNA8M,CkBMC,E9BbE9J,EYOE,AGAA,ATCA,CMDCsI,AGAAzH,CeMC,ErBVEqG,AMIA,ATCA3E,CSDE,CeMA/F,ElBNE,CmBJC,AnBIC4J,EkBMC,AxBLA,CyBLEA,ADUD3J,AxBLA,CMDE,ANCD+F,CGLC0E,CAAA,AqBUC,AfNAwF,CgBJE,A/BHD1M,CSGC,AGIE,AZPH,EAAG,C+BGG,ADUF,AfNC,ATCD,ESDE,ATCAyC,CSDC,KTCK,CwBKC,EAAE,ExBLE;AFA3CpE,EwBTC,AXJA,AOQA,AzBNA,EgCOE/B,AtBAAgC,AMIA2H,AfPA,EMQEvD,CFDL,C0BMO2T,AlBNA,ARAPrU,CLXQxE,CgCOC,CAACwb,A/BHA1a,EMQE,CMDCgJ,AGAN,ATCMhE,CSDLQ,CeMO,A1BNf,E2BJiB,CAACmV,ADUA,A1BNlBjX,AJPkB,CAACnD,CeOL,CNJH,AGIU,AGAN,CNJHuB,AqBUU,AfNN,ATCM,ANRA,C8BaC+V,AfNNjN,AfPM,CYOC9C,CNCC,CFDzB,C2BJ2B,AhBIN,CgBJO,AnBIA,AGAL0D,CgBJM,AnBIAnO,CmBJC,AhCPA6B,CaWC,AbXAP,AOYA,CyBLC,ChBIJ,CgBJM,EAAG,AnBID4M,AbXA,C+BiBC,AfNJ,CNJL,AVPU,CUOT,CqBWlB,C9Bd8B,CAAC,CSGT,CAAC,AqBWnB,CAACsM,CCX8B/P,GnBIG,CmBJC,CAACzK,EAAG,EAAC,CAAC,GDW1B,CAAC6a,sBAAsB,GAC1C,IAAI,CAACzB,WAAW,CAAC0B,gBAAgB;AFhB7C,EGKE,AdRA5G,AOQAmE,AxBHA,C+BGC,CtBAC,AVPAhX,EgBWE,CEZC6S,CaoBC,AlBRA,AKZD,AXaC,EGLE5J,AQRA,ClBCC,C+BmBCoQ,AlBRA,AGAAtJ,AhBXAtP,CaWC+L,CYJCwK,CAAA,EAAG,AzBPA,CAAC,CgBWC,CNJL,AqBYM,CrBZLjQ,CqBYO,AfRA+F,CHAC,CAAC1D,EHJJ,CAAC,AMIM,CNJL,AGIM,AGCnB4G,EHDqB1F,EbXE,CAAC,CgBYlB,CAAElB,GHDqB,CAAC,AGClB,IAAK;AaVzB/H,EGOCya,A/BHA,ESEExY,AQRA,AOQA,AzBPAtD,EaWE,CAAC,AgBVN,ChBUO,AgBVPwX,AXFO,AOQA,ATKE,ATAF,CkBLCb,AxBFA1T,C8BcC,C/BnBC,CkBDC,AFaEgN,AhBZFhQ,CgCQC,AdTA8Q,CaoBC,AxBPApI,EyBJEmT,AtBDP,CsBCO,AtBDNnY,AmBNT,AJMgB,ATKE,AhBZF,C+BmBC,ANZAnC,AzBPAvB,C+BmBCkZ,CFlBlB3B,AbWqB3H,CNLR,CsBCQ,AtBDP,AHKO,CkBLC,AzBPA,CAAC,CgBYG,ATAFnK,CkBLCpE,ATKE4O,CfPDjN,CiBNC,AjBMAC,C4BJ3B,CXF6B,AFaE,CAACkG,CTAD,CwBOC,AxBPAnD,EwBQrB,AfRyB,CNLR,AMKS2D,CNLR,EqBad,AxBRuB,CwBQtBuP,AxBRuB5Q,CSAG,CAAC,CTAD,ANPA,CwBET,AlBKW3E,CkBLVzB,AxBFU,GMOI,GkBLR,CAAC,AlBKY,CkBLX,CMaZ,CAACpB,CxBR0B,IAAI,CAAC6C,GwBQtB,CAACxC,AxBRyB,CAAC,CAAC,IwBQrB,CAAC,OAAO,CAAC;ErBZvD,EsBCE,APDA,AzBPA9C,ACKA,EYME,AKZA,EcSE,AhBIE,ATAFkH,ANPAtC,C+BGCqY,CDYClC,AlBTArO,AKZA,AOQA9H,CPRC6N,CFaGnB,GTAC,CAACjH,EyBJE,ADYA,A/BpBA,CgCQCkK,ADYA9R,A/BpBAnB,IAAI,ACKA,C+BGC,AhBIE,AhBZFK,AOYA,CyBJC,APDA,AlBKA,CyBJC,AdTA,AFaE,CEbD4S,CaqBC,ANbAvR,AxBFA,C8BeCN,A/BpBA,CAAC,ACKA,E8BeE,AbrBA,AjBMA,C8BeC,AbrBA,CLYZ,AKZa,CLYZ,KkBSkB,CAAC,KNbL,CAACgC,KZIE,CAAC,YYJe,CAAC,CAAC;AfCzD,EVPE,EgCQE,AnBGA,AKZA,AOQA,CZIC,CAAC,ANCA,ANPAE,CMOC,CyBJC,ADYA,ANbAA,COCCgZ,ChBIGjM,KAAK,IgBJE,CAAC,AhBIEJ,CgBJD,A/BHA,EwBEE,CxBFC,CwBEC,ATKE,CAACK,EfPA,EeOI,CAAC9G,IAAI,CAAChK,OAAO,CAAC;ANL7CiC,EGKC,AKZA,AlBEAzB,EgCOEI,A/BHA,EwBEE,AzBNAJ,AOWA8F,CGNL,AVLMlH,CUKNiL,AqBcO,AfRE,ESLA,COCC,APDAqN,COCCjT,ADYA,CAACsV,AxBRA,CPXC,AOWAtT,CyBJC,CAAC,AhCPA,KUKf,AHMoB,GGNpB4D,AHMuB,GwBQG,GAAG4P,AxBRA,CkBLC,CAAC7X,COCC,CAAC,GtBFjC,AeCoC,CMaC,CAAC,CAAC,ANbA5C,IAAI,CAACC,SAAS,CAACqE,eAAe,EAAE,CAAC,CAAC;EOExE,AnBIAsJ,AKZAoG,CcQC,CPDC,AzBNA,ACIAtR,I8BeI,AfRE,ATAFmE,IwBQI,AlBRA+G,AZPA,C8BeC2M,AlBRA/P,AZPA7H,CMOC,CSAG0O,ATAFvK,CNPC,CYOC,AZPA,EYOE4E,CKZCsI,AFYE,CEZDhP,CXYC,CAAC3D,EWZE,EaoBE,AlBRA,AKZA,CaoBCiP,AxBRA,CMAC,ANAA,MNPM,EAAEhM,K8BeK,CAAC,S9BfS,CAAC;E+BKnD6Y,APFA,AxBFA,EYOE,AKZA,AlBCA,EgBWI,ATAF,CSAG,ATAF,CWZC,AFYE,CEZDnY,AFaA2E,CeOC4G,AlBRApC,AbXArM,EgBYE,CEbC,AFaC0I,CEbA0J,ClBCC,CgCQC,ChBIE,CeOA,A/BnBA,CgCQEtT,CDWA,CfPG4J,CHDD,AbXA,CAAClK,CgCQE,CnBGA,AGCE,CAACP,EgBJE,ADWF,AbpBA,AFaE,CHDDyL,AGCE,CEbD,ClBCC,CAACzJ,SAAS,CAAC,IAAI,CAAC,QaWN,CAACyI,IAAI,EAAE,IAAI,EAAEkB,QAAQ,CAAC;AYJ/D,ExBDE,E+BGE,AnBGA,ANAA,CAAC,CWZC,AFaA,ATDA,EyBHE9K,AnBGA,CAAC2E,AZNAhB,C8BcCiM,AfPA,CAACjL,EgBJE,CAAC1E,CDWC,ClBRC,CmBHC,ADWA,AlBRA0B,CGCC,CAACgK,GgBJG,G/BHGhI,CAAA,EYMG,AZNA,C+BGC,AnBGA4J,ImBHI,CAACvN,ChBIC,CAAC,GgBJG,CAAC2c,CnBGC,CAAChY,MmBHM,CnBGC,CmBHC,AnBGA,GGCG,CAAC,CAACmH,OAAO,CAAEC,IAAI,IAAK;ASNxElK,ElBMC,EMAE,AKZA,AlBCA,ACKA,E+BGE,CPHL,CMcO,ANdPoV,ATOO,CeOC,CCXC,ADWA,CCXC2F,ADWA,AlBRArP,AZNAzL,C8BcC,AfPAyO,OAAO,AfPA,CeOCI,AfPAtO,E+BGE,APHrB,COGsB,AnBGA,AZNA,C+BGC,A/BHA,CwBAvB4U,GTO2B,CAAClL,IAAI,CAAC3H,IAAI,CSPrC,ATOsCjF,AfPA,CAAC,CeOC,CAAC,EAAE;EHA1C,AZNA,E+BGE,AdTA,AlBCA,E+BmBE,IfPI,AhBZAiC,mBAAmB,GAAGF,KAAK,CAACG,aAAa,CAAC,eAAe,CAAC;AaYpE,EmBHE,AzBGA,ANLA,C+BEC,CDWC,AbpBA,AlBCA,C+BmBC,CAAC,E/BnBE,CAACD,ACMAwC,CiBPC2P,AFaAxH,IAAI,CAACxK,SAAS,CAACK,AfNAgC,CAACC,EDNE,EAAE,CgBYC,CEbC,AFaA,AfNA,EAAE,CiBPCO,IAAI,CAACkP,AFaA,CAAC,aEba,GAAG,GAAG;ALY3DzR,EmBDC6a,ADUA,AxBRA,EWZE,AjBOA,EDNElc,CaUL,CAAAiM,AGEO,AfNA5I,CeMC,CEbC2P,EcUEkJ,CAAA,AhCTC,CAACjc,ACMA,C+BGC,AhBGA,ATDA2I,CMDd,GAAAqD,AbVkB,ACMAlK,CDNC,COWC6G,CAAA,EAAG,GMDvB,CZJ2B,EAAE,CiBPC,GAAGhF,IAAI,CAACqP,aAAa,GAAG,GAAG,WlBCW,CAAC;E+BqBpE6F,ECXE7U,AdVA,AXYA,EPXE,ACMAZ,EMKE6C,EWZEgN,AFaA3H,EgBHH,A/BHK,C+BGJnH,ChBGM,CAACrD,AfNA,G8BcG+X,CAACta,AxBTA,ANLA,GMKG,EyBFH,AhBGK,CgBHJ,AhBGKwC,CeQC,EAAE,AfRA,ATDA,CyBFJ,AhBGK,CgBHJkX,EzBEO,CAAClS,EAAE,CAACE,CWZC,AFaA,CAAC,EEbEtC,CcUJ,CAAC,CAACS,CdVM,CAAC8O,EXYE,CAAC,IAAI,CAAC5M,CyBFJ,CAAC,IAAI,CAACyR,EzBEO,EAAE,CWZC,GAAG,GAAG,CcUJ,CAAC,CzBEM,CAAC;IyBDvE,ADWA,AbrBA,AlBCA,AOWA,ANLA,I+BGI,AhBGA,ATDAtR,CyBFCsR,CDWClZ,AbrBAsU,GXYG,EwBSE,CxBTC,EwBSG,GCXE,CAAC9D,AzBEApJ,KyBFK,CAAC,CAAC,IzBEI,CwBSC1H,AxBTA0H,KWZK,EaqBE,CAACvH,AbrBAiF,EaqBG,CxBTA,CwBSC,AbrBA,AXYA6C,CWZC4M,UXYU,CAAC,EWZE,EXYE,CWZC,AXYA9M,GWZG,MXYM,CAAC;EyBDvE,EDWE,AxBTA,ANLAjF,EeME,CAAC,CAAC,EeQEoY,CxBTChT,CNLC,CAACnF,C8BcC,ExBTE,ANLA,C8BcC/C,AxBTAsI,ANLA,MMKM,CwBSC,AxBTA,CwBSC4S,AxBTA,IwBSI,G9BdG,EAAErW,MAAM,CAAC;E+BKvCgZ,AzBCA,ANLA,E8BcE,AbrBA,AFaA,AhBZA,CgBYC,CAAC,IeQIjd,GCVGid,CAAA,EAAG,CDUC,GAAG7d,OAAO,CAACY,OAAO;AxBRnC,ANLA,EeME,EgBFE6E,ADUA,AbrBA,AlBCAvD,KAAK,CkBDC4S,AlBCAzS,EgCUH,CAACqD,UhCVe,CgCUJ,AhCVK,CgCUJ,AdXK,GAAGN,CcWJ,CAACsU,EdXO,CAAC3E,QcWG,CAAC,CAAChP,AdXK,GAAG6O,ClBCC,CAAC,CAACtS,MgCUC,CAAC,IAAI,AhCVK,CgCUJkX,EhCVOxZ,OAAO,GgCUF,CAAC,CdXM;AXY1E6C,ANLAA,E+BKC,AhBGA2N,EeOE,AbrBA,AlBEApO,GOSH,ANLA,CeQOoO,ATHPjH,ANLAzG,CeQO,CeOEpC,AbrBAsU,CFcC,KEdK,AjBMf,CMKA,CwBUiB,CbrBE,AjBMnBlS,CMKAyG,CwBUoB/I,E/BnBE,CAACL,EAAE,CCIzB,E8Be4B,A/BnBA,AOS5B,CwBU6BQ,G/BnBG,CAACL,KAAK,CAAC,CAAC,G+BmBG,CAAC,uBAAuB,CAAC;AbpBrE,IaqBI,AfPA,AhBZA,IgBYI,CEdC8E,AFcAO,CeOCwV,GbrBG,CAAC/W,EFcE,CAAC7B,EEdG,GaqBE,GAAG7B,CfPC,CAAC8P,MeOM,AfPA,CeOC5P,AfPA,OeOO,CAACuB,GfPG,CAAC,KeOK,CAAC,IAAI,CAAC;AbpBzD,EcWE,EDUE,AfPA,AhBZA,IgBYI,AhBZA,CgBYC4N,GhBZG,CAAC9P,CkBFCmF,GlBEG,CkBFC,CAAC6P,AlBEA,KgBYK,CAAC1S,IEdK,KFcI,CAACiO,MAAM,CAAC,WAAW,CAAC;AEbtD,EcWE,EDUE,AfPA,EhBZEpO,EgCSEwb,AhBGA,EeOExC,EfPE,CAACzV,MgBHMiY,CAAA,ADUC,AfPA,CAACrb,CgBHC,AdXAgS,CaqBC4G,E/BnBE,CAAC5Y,IgBYI,CAACqP,IeOI,A/BnBA,C+BmBCvP,A/BnBAG,GgBYG,AhBZA,CgBYC,AhBZC,IkBFG,CAAC0S,IaqBI,CAAC,CfPC,CEdC,AFcA,CEdC,CAAC,AFcA,CEdE,ClBEA,IAAI,CAACjV,I+BmBI,A/BnBC,C+BmBA,C/BnBC,CAAC;AkBDpE,IcWI,ADUA,A/BnBA,EgBYE,IgBHI6d,ADUAzC,AfPA,CAACzL,OeOO,CfPC,CgBHC,AhBGA7M,CeOCoY,AbrBA3G,EcWE,AhBGA,CAAC,GgBHG,CAACgF,KDUK,CAACnX,MCVM,CAACW,CdXC,CAACkS,AFcA,EAAE,CgBHC,CAAC/D,ADUA,CAAC,CfPC,CEdC,AFcA,CgBHC,AdXA,CcWC,AdXA,CcWC,AdXC,eaqBc,CAAC;AbpBrE,IcWI,ADUA,AfPA,CAAC,KeOKmK,CfPC,WeOW,GAAGH,EbrBE/V,IAAI,CAAC+P,KaqBK,CAAC9S,WbrBY,EaqBC,CAC7C,6BACF,CAAC;AbtBL,IcWI,ADYA,A/BrBA,EgBYE,EgBHEuI,EDYE2Q,AfTA,CAAC3L,CgBHC,GAAG,IhBGI,CeSC,AfTA7M,CgBHCkI,EDYEkQ,AfTA,CAAC,UEdUzG,CauBC,CAACrS,OfTO,EAAE,IgBHX,ADYe,CCZdmJ,ADa7B,AfV4C,CAAC,UEdU,CAAC0J,EcWb,CAAC,CAAC,GdXkB,CAAC,CAAC,CAAE,kBayBrE,CAAC;AbxBL,IcWI,ADcA,AfXA,AhBZA,MgCSMjR,ADcAuX,A/BvBA/Y,GgCSG,GAAGK,IDcI,C/BvBC,E+BuBEqY,C/BvBCjZ,KkBFKkD,AlBEA,CAAC/C,GkBFG,CcWT,AdXU0S,CcWTpR,ADcU,CAACtB,KCdL,CAAC,ChCTW,CkBFE,AlBED,K+BuBK,CAAC,GCdP,CAAC,kBhCT4B,CAAC,I+BuBI,CAAC;AbxB9E,EFcE,EgBHE,ADcA,A/BvBAI,IgCSI,CAACwB,CDcCwX,ECdE,EAAE,ChCTC,CAAC/Y,G+BuBG,GAAGyY,C/BvBC,GAAG,MAAM,E+BuBE,CAAC9Y,CbzBCuS,AlBEA,CAAC1T,IAAI,CAAC,CAAC,K+BuBK,CAAC,gBbzBgB,CAACgU,OAAO,CAAC,CayBC,AbzBA,CayBC,AbzBC;AAC7E,EFeE,EeUE,ECdEpV,EhBIEwQ,EeUEoL,UAAU,CbzBC5G,AFeAxE,CAAA,CeUE6K,CfVC,WeUW,CCdf,ADcgB9Y,AbzBA,CcWfjB,AdXgB8T,IcWZ,CACjB,EdZoC,CAAC,CAAC,CAAE,EayBC,CAAC,2BAA2B,CAAC,iBCZxE,CAAC;AdZP,Ia0BI,AfXA,AhBbA,CkBFC,CcaC,EDaElV,EfXEiL,GgBFG,EDaE,CAAC0Q,CCbC,MDaM,IAAI,KAAK,EAAE,IfXX,CAACxQ,UAAU,CAAC,CAAC;EAClC,EgBFE,AdbA3J,AlBEA,E+BwBEia,E/BxBE,CAACjb,EkBFE,CAAC6E,Ga0BG,Ab1BA,Ca0BC9C,Ab1BAyS,ClBEC,CAACrU,IkBFI,CAAC,Ea0BE,CAAC6B,GAAG,CAAC,E/BxBE,CAAC,IAAI,CAAClC,E+BwBE,CAAC,E/BxBE,CAAC,EAAE;EkBD5C,AFgBA,EgBHE,ADaA,CAAC,C/BxBC,EgCWEwd,AhBGAvN,GeUG,IAAIvQ,GCbG,ChBGCuQ,CgBHC,AhBGD,EeUG,AfVA,CeUCoL,OAAO,IAAI,MAAM,EAAE;EbxBxC,EFeE,EgBHE,ADaAH,A/BxBA,GkBDGpG,CFeCnK,AhBdA,CAAC1K,K+BwBK,CAACgC,CbzBC6S,CAACnR,ClBCC,CAACtB,CkBDC,EAAE8P,EayBE,CAACjQ,GAAG,CAAC,C/BxBC,CAACN,CkBDC,EAAE,EFeb,AhBde,CgBcdwJ,AhBde,E+BwBE,CAAC,OfVR,CAAC,CAAC;EAClC,EeUE,AbzBA,AlBCA,C+BwBC,CCbC,EdZE,CAACzH,CcYC,CAACuV,ADaA,CbzBC,EAAE,CayBCxZ,OAAO,CCbC,ADaA2b,CCbC3Y,KAAK,CDaC,ECbE,EAAE,ADaA,SAAS,EAAE;AfT7C,EhBdE,IgCWI,ADaA0Y,AbzBA,OAAO,GayBG,CAACnZ,AbzBA,SayBS,CAACC,GAAG,CAAC,UAAU,CAAC;AfVzCK,EhBZC3B,E+BuBE,AbzBA,EcYE,AhCVAA,CgBYL,AhBZK,CgBYLyO,ChBZQ,CgCUC,CAAC/E,IAAI,AhBEd,EgBFgB,ChBEhB+E,OAAA;IEZG,AlBCAnP,IgCUIoK,GdXGqI,CcWC,AhCVA,CAACtS,EgCUE,CdXC,CAACsD,GAAG,CcWCgH,AdXA,CACdyC,IAAI,CAAEkF,AlBAc,CAAC,IAAI,CAACtS,EkBAZ,GlBAiB,CkBAZ,AlBAa,EAAEsC,MAAM,CAAC,CgCUd,AhCVe,CgCUduI,UAAU,CAAC;EhCT5C,E+BuBE,EbvBI,IcUEC,AdVE,CAACwH,IcUE,EAAE,EdVI,CAACQ,EAAE,EAAE,GcUC;AhCT3B,I+BuBIgI,IbvBM,EcUAhX,IDaI,AbvBE,CcUD,ADaA7B,ECbEO,CdVGgE,KAAK,CauBD,AbvBG,CauBFtE,GAAG,CAAE,GAAE0Y,GCbP,CAAChX,ADaW,QCbH,CAAC,MDagB,CAAC,GbvBKD,GAAI,EAAC,CAAC;AlBA9DpB,I+BwBGuY,EbvBI,ClBDP,CgCWO,AhCXPtb,CgCWQ,CAAC,IDaI,CAACK,EAAE,GAAGG,E/BxBnB,G+BwBwB,A/BxBxBR,cAAA;I+ByBGub,ECbE,AdVE,MauBI,CAAC/Y,AbvBEsQ,QAAQ,CAACyC,EauBA,EbvBI,CauBDzU,AbvBE,CAAC,MauBI;IAC9Bwa,AbvBE,CAAC,CcUD,AdVE,CACD1N,IAAI,CAAEtI,EasBC,CAACwW,CbtBE,IAAK,KasBG,GAAG,KAAK;MCZ3B,AdTEnJ,McSIsL,IdTM,CAAC3Y,IAAI,CAACkQ,CcSD,GAAG,EdTI,CAAC,GcSC1K,IAAI,CAACF,UAAU,CAAC;IDc5C,AbtBE,CAAC,CAAC,CACD6K,CcQC2F,IAAI,AdRA,CAAEzZ,CcQA,IdRK,EcQC,EdRI;IasBpB,EbrBID,EcQAZ,ADaA,CAAC2Y,IbrBM,CAACtX,CcQD,EAAE6b,EdRI,CaqBD,AbrBErc,CaqBDkB,IbrBM,CAAC,MaqBI,CAACyY,UAAU,CAAC;IACxCA,ECbE,AdRE5Z,CcQD,CAAC,KdRO,CaqBD,AbrBEC,CaqBDoa,IbrBM,CACV,EaoBW,CAAC,IAAI,CAAC,GAAG7b,OAAO,C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","file":"script.d573be0b.js","sourceRoot":"..","sourcesContent":["function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// Show all uncaught errors as UI notifications\n/*\nwindow.onerror = function (message, source, lineno, colno, error) {\n const errorDetails = `${message} at ${source}:${lineno}:${colno}`;\n UINotification.show(errorDetails, 'error');\n return true;\n};\n*/\n\nexport class UINotification {\n constructor(message, type, autoDismiss) {\n const id = simpleHash(JSON.stringify(message));\n this.type = type;\n this.domId = `notification-${id}`;\n this.container = document.body;\n this.template = document.getElementById('notification-template').content;\n this._bindEventListeners();\n if (autoDismiss) {\n this.autoDismiss();\n }\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n autoDismiss() {\n setTimeout(() => {\n this.hide();\n }, 2000); // 2000 milliseconds (2 seconds)\n }\n\n static show(message, type) {\n const notification = new UINotification(message, type);\n notification.show(message);\n return notification;\n }\n\n static initialize() {\n // Store the original console.error function\n const originalConsoleError = console.error;\n\n // Override console.error\n console.error = function (...args) {\n UINotification.show(args);\n // Call the original console.error with all arguments\n originalConsoleError.apply(console, args);\n };\n }\n\n static handleApplicationError(error) {\n console.debug('caught error');\n console.error(error);\n UINotification.show(error);\n }\n\n show(message) {\n // Clone the template\n const clone = this.template.cloneNode(true);\n\n // Find the root element of the notification in the clone\n const notificationElement = clone.querySelector('.notification');\n if (!notificationElement) {\n console.error('Notification root element not found in template');\n return;\n }\n\n // Set the message\n clone.querySelector('.notification-message').textContent = message;\n\n notificationElement.id = this.domId; // Set ID on the actual element, not the fragment\n // Add type, for example, error\n if (this.type) {\n notificationElement.classList.add(`notification-${this.type}`);\n }\n\n // Add close functionality\n const closeButton = clone.querySelector('.close-notification-button');\n closeButton.onclick = () => this.hide();\n\n // Don't show the same notification twice\n if (!document.getElementById(this.domId)) {\n // Append to the container and display\n this.container.appendChild(clone);\n }\n }\n\n hide() {\n document.getElementById(this.domId)?.remove();\n }\n}\n","export class Settings {\n // Static method to set a value in localStorage\n static set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Static method to get a value from localStorage\n static get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Static method to remove a value from localStorage\n static remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n\n static getUrl(uri) {\n try {\n const baseUrl = Settings.get('url');\n if (uri) {\n return new URL(uri, baseUrl).href;\n } else {\n return baseUrl;\n }\n } catch (error) {\n return null;\n }\n }\n\n static setUrl(url) {\n Settings.set('url', url);\n }\n\n static getModel() {\n return Settings.get('model');\n }\n\n static setModel(model) {\n Settings.set('model', model);\n }\n\n static getSystemPrompt() {\n return Settings.get('system-prompt');\n }\n\n static setSystemPrompt(systemPrompt) {\n if (systemPrompt === '') {\n systemPrompt = null;\n }\n Settings.set('system-prompt', systemPrompt);\n }\n\n static getModelParameters() {\n return Settings.get('model-parameters');\n }\n\n static setModelParameters(modelParameters) {\n if (modelParameters === '') {\n modelParameters = null;\n }\n Settings.set('model-parameters', modelParameters);\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static setCurrentChatId(chatId) {\n if (chatId === undefined) {\n chatId = null;\n }\n Settings.set('currentChatId', chatId);\n }\n}\n","export class Event {\n static listen(eventName, handler) {\n window.addEventListener(eventName, (event) => {\n handler(event.detail);\n });\n }\n\n static emit(eventName, data) {\n let log = `${eventName}`;\n if (data?.id) {\n log += ` id: ${data.id}`;\n }\n console.log(log);\n const event = new CustomEvent(eventName, {\n detail: data || {},\n bubbles: true, // This makes the event bubble up through the DOM\n });\n window.dispatchEvent(event);\n }\n}\n","export class DOM {\n static showElement(element) {\n element.classList.remove('hidden');\n return this;\n }\n\n static hideElement(element) {\n element.classList.add('hidden');\n return this;\n }\n\n static enableInput(element) {\n element.removeAttribute('disabled');\n return this;\n }\n\n static disableInput(element) {\n element.setAttribute('disabled', 'disabled');\n return this;\n }\n}\n","export function debounce(func, wait) {\n let timeout;\n\n return function funcWrapper(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n","export class Database {\n constructor(dbName, objectStores, migrations) {\n this.dbName = dbName;\n this.objectStores = objectStores;\n this.dbConnection = null; // Initialized in open\n this.migrations = migrations;\n }\n\n async open() {\n if (this.dbConnection) {\n throw new Error('Connection already open');\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.migrations.version);\n\n request.onerror = (event) => reject(event.target.error);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n const transaction = event.currentTarget.transaction;\n this.migrations.upgrade(db, transaction, event.oldVersion);\n };\n request.onsuccess = (event) => {\n this.dbConnection = event.target.result;\n resolve(this.dbConnection);\n };\n });\n }\n\n async transaction(storeName, mode) {\n return this.dbConnection\n .transaction([storeName], mode)\n .objectStore(storeName);\n }\n\n async add(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('add', store.add(data));\n }\n\n async get(storeName, id) {\n const store = await this.transaction(storeName, 'readonly');\n return this.handleRequest('get', store.get(id));\n }\n\n async put(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('put', store.put(data));\n }\n\n async delete(storeName, id) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('delete', store.delete(id));\n }\n\n async getAll(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('getAll', store.getAll());\n }\n\n async clear(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('deleteAll', store.clear());\n }\n\n handleRequest(type, request) {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n\n request.onerror = (event) => {\n const error = `Database ${type} operation failed: ${event.target.error.message}`;\n reject(new Error(JSON.stringify(error)));\n };\n });\n }\n}\n","export class Migrations {\n static version = 2;\n static upgrade(database, transaction, oldVersion) {\n console.debug(\n `Migration needed. Old version ${oldVersion}. New version ${this.version}.`,\n );\n const funcName = `upgradeToVersion${this.version}`;\n const upgradeFunc = this[funcName];\n if (!upgradeFunc) {\n throw new Error(`Upgrade function missing for ${funcName}`);\n }\n if (this.version >= oldVersion) {\n upgradeFunc({ database, transaction });\n }\n }\n\n static upgradeToVersion2(context) {\n // Create chats\n context.database.createObjectStore('chats', {\n keyPath: 'id',\n autoIncrement: true,\n });\n // Create chat_messages\n const chatMessages = context.database.createObjectStore('chat_messages', {\n keyPath: 'id',\n autoIncrement: true,\n });\n chatMessages.createIndex('by_chat', 'chatId', { unique: false });\n }\n}\n","import { Database } from '../Database.js';\nimport { Migrations } from '../Migrations.js';\n\nexport class BaseModel {\n constructor(data) {\n Object.assign(this, data);\n }\n\n async create() {\n const key = await this.constructor.db.add(this.constructor.storeName, this);\n if (!this.id) {\n this.id = key;\n }\n return this;\n }\n\n async save() {\n return await this.constructor.db.put(this.constructor.storeName, this);\n }\n\n async delete() {\n return await this.constructor.db.delete(\n this.constructor.storeName,\n this.id,\n );\n }\n\n jsonify() {\n return JSON.stringify(this);\n }\n\n static async database(name, store) {\n this.dbName = name;\n this.storeName = store;\n this.db = new Database(name, [store], Migrations);\n await this.db.open();\n }\n\n static async transaction(mode) {\n return await this.db.transaction(this.storeName, mode);\n }\n\n async transaction(mode) {\n return await this.constructor.transaction(mode);\n }\n\n static async get(id) {\n const data = await this.db.get(this.storeName, id);\n return new this(data);\n }\n\n static async clear() {\n return await this.db.clear(this.storeName);\n }\n\n // TODO: sorting and selecting only certain attributes\n static async getAll() {\n const records = await this.db.getAll(this.storeName);\n return records.map((data) => new this(data));\n }\n\n /**\n * Retrieves all objects associated with a given ID and index.\n *\n * @param {number|string} chatId - The ID of the chat.\n * @returns {Promise} A promise that resolves to an array.\n */\n static async getAllByIndexAndId(indexName, id) {\n // Open a transaction and access the messages store\n const transaction = await this.transaction('readonly');\n\n // Use an index to find objects with the specified id\n const index = transaction.index(indexName);\n const request = index.getAll(id);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // Convert the result into instances\n const messages = request.result.map((data) => new this(data));\n resolve(messages);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n // Exports the whole store\n static async export() {\n let transaction = await this.db.transaction(this.storeName, 'readonly');\n let store = await transaction.transaction.objectStore(this.storeName);\n return store.getAll();\n }\n}\n","import { BaseModel } from './BaseModel.js';\n\nexport class ChatMessage extends BaseModel {\n static async initialize() {\n await this.database('ChatApp', 'chat_messages');\n }\n\n static async getAllByChatId(chatId) {\n return this.getAllByIndexAndId('by_chat', chatId);\n }\n}\n","import { BaseModel } from './BaseModel.js';\nimport { ChatMessage } from './ChatMessage.js';\n\nexport class Chat extends BaseModel {\n async addMessage(data) {\n data.chatId = this.id;\n return await new ChatMessage(data).create();\n }\n\n async getMessages() {\n const messages = await ChatMessage.getAllByChatId(this.id);\n this.messages = messages;\n return this.messages;\n }\n\n static async initialize() {\n await this.database('ChatApp', ['chats']);\n }\n\n static async clear() {\n await ChatMessage.clear();\n await super.clear();\n }\n\n static async get(id) {\n const chat = await super.get(id);\n\n /*\n if (chat) {\n // Fetch all messages for this chat\n const messages = await ChatMessage.getAllByChatId(id);\n chat.messages = messages;\n }\n */\n\n return chat;\n }\n\n static async delete(id) {\n // Delete the chat instance\n await super.delete(id);\n\n // Delete all associated messages\n const messages = await ChatMessage.getAllByChatId(id);\n for (const message of messages) {\n await message.delete();\n }\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\nimport { Settings } from './models/Settings.js';\n\n// TODO: Move all actions here?\nexport class AppController {\n static async updateChat(chat, data) {\n Object.assign(chat, data);\n await chat.save();\n // TODO: Move to BaseModel\n Event.emit('chatUpdated', chat);\n }\n\n static async createChat(data) {\n if (!data) {\n data = {};\n }\n if (!data.title) {\n data.title = 'Untitled';\n }\n if (!data.model) {\n data.model = Settings.getModel();\n }\n const chat = await new Chat(data).create();\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatCreated', chat);\n Event.emit('chatSelected', chat);\n return chat;\n }\n\n static async deleteChatMessage(messageId) {\n UINotification.show('Deleted message').autoDismiss();\n const message = await ChatMessage.get(messageId);\n message.delete();\n }\n\n static async deleteChat(chat) {\n await chat.delete();\n if (Settings.getCurrentChatId() === chat.id) {\n Settings.setCurrentChatId(null);\n }\n Event.emit('chatDeleted', chat);\n }\n\n static async getCurrentChat() {\n const chatId = this.getCurrentChatId();\n if (chatId) {\n return await Chat.get(chatId);\n }\n return null;\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static async setCurrentChat(chat) {\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatSelected', chat);\n }\n\n static async setCurrentChatId(chatId) {\n const chat = await Chat.get(chatId);\n if (chat) {\n await this.setCurrentChat(chat);\n }\n }\n\n static async clearChats() {\n Settings.setCurrentChatId(null);\n await Chat.clear();\n Event.emit('chatsCleared');\n }\n}\n","import { AppController } from './AppController.js';\n\nexport class ChatListItem {\n constructor(chat, chatList, selected) {\n this.chat = chat;\n this.chatList = chatList;\n this.content = document\n .getElementById('chat-list-item-template')\n .content.cloneNode(true);\n this.element = this.content.querySelector('.chat-list-item');\n this.element.title = this.chat.title;\n this.element.data = { id: this.chat.id };\n this.element.classList.add(`chat${this.chat.id}`);\n if (selected === true) {\n this.element.classList.add('selected');\n // this.content.querySelector('.icon-selected').classList.remove('hidden')\n }\n this.setTitle();\n this.bindEventListeners();\n }\n\n render() {}\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', this.onMouseover.bind(this));\n this.element.addEventListener('mouseout', this.onMouseout.bind(this));\n this.element.addEventListener('click', this.onClick.bind(this));\n this.element\n .querySelector('.list-item-delete')\n .addEventListener('click', this.deleteChat.bind(this));\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n\n onClick() {\n this.chatList.selectChat(this.chat.id);\n }\n\n setTitle() {\n const chatTitle = this.content.querySelector('.chat-title');\n chatTitle.textContent = this.chat.title;\n }\n\n deleteChat() {\n AppController.deleteChat(this.chat);\n this.element.remove();\n }\n}\n","export class DragAndDrop {\n constructor(selector) {\n this.listItems = document.querySelectorAll(selector);\n this.draggedItem = null;\n this.initializeDragAndDrop();\n }\n\n initializeDragAndDrop() {\n this.listItems.forEach((item) => {\n item.addEventListener('dragstart', this.handleDragStart.bind(this, item));\n item.addEventListener('dragover', this.handleDragOver.bind(this));\n item.addEventListener('drop', this.handleDrop.bind(this, item));\n item.addEventListener('dragend', this.handleDragEnd.bind(this));\n });\n }\n\n handleDragStart(item) {\n this.draggedItem = item;\n }\n\n handleDragOver(e) {\n e.preventDefault();\n }\n\n handleDrop(item) {\n if (item !== this.draggedItem) {\n let currentHTML = item.innerHTML;\n item.innerHTML = this.draggedItem.innerHTML;\n this.draggedItem.innerHTML = currentHTML;\n console.debug('dnd drop');\n }\n }\n\n handleDragEnd() {\n this.draggedItem = null;\n }\n}\n","import { Event } from './Event.js';\nimport { ChatListItem } from './ChatListItem.js';\nimport { DragAndDrop } from './DragAndDrop.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatList {\n constructor() {\n this.element = document.getElementById('chat-list');\n this.template = document.getElementById('chat-list-item-template').content;\n this.bindEventListeners();\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n });\n }\n\n bindEventListeners() {\n Event.listen('chatCreated', this.handleChatCreated.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatsCleared', this.handleChatsCleared.bind(this));\n Event.listen('chatUpdated', this.handleChatUpdated.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n async selectChat(chatId) {\n await AppController.setCurrentChatId(chatId);\n }\n\n handleChatCreated(chat) {\n this.appendChat(chat, true);\n }\n\n handleChatDeleted(chat) {\n if (this.chat?.id === chat.id) {\n this.chat = null;\n }\n this.element.querySelector(`.chat${chat.id}`)?.remove();\n }\n\n handleChatsCleared() {\n const elements = this.element.querySelectorAll('.chat-list-item');\n elements.forEach((element) => element.remove());\n }\n\n handleChatUpdated(chat) {\n const listElement = this.element.querySelector(\n `.chat${chat.id} .chat-title`,\n );\n if (listElement) {\n listElement.textContent = chat.title;\n }\n }\n\n handleChatSelected(chat) {\n if (this.chat) {\n const previousListElement = this.element.querySelector(\n `.chat${this.chat.id}`,\n );\n if (previousListElement) {\n previousListElement.classList.remove('selected');\n }\n }\n const newListElement = this.element.querySelector(`.chat${chat.id}`);\n if (newListElement) {\n newListElement.classList.add('selected');\n }\n // Remember selected chat\n this.chat = chat;\n }\n\n render() {\n const currentChatId = AppController.getCurrentChatId();\n this.element.innerHTML = '';\n Chat.getAll().then((chats) => {\n chats.forEach((chat) => {\n const selected = chat.id === currentChatId;\n this.appendChat(chat, selected);\n });\n new DragAndDrop('.chat-list-item');\n });\n }\n\n appendChat(chat, selected) {\n const chatListItem = new ChatListItem(chat, this, selected);\n this.element.appendChild(chatListItem.element);\n return chatListItem;\n }\n}\n","import { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\nexport class DownloadChatsButton {\n constructor() {\n this.button = document.querySelector('#export-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.button.addEventListener('click', () => {\n this.exportChat();\n this.exportChatMessages();\n });\n }\n\n async exportChat() {\n const request = await Chat.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chats.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n\n async exportChatMessages() {\n const request = await ChatMessage.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chat_messages.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n}\n","export class LocalStorage {\n // Set a value in localStorage\n set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Get a value from localStorage, return defaultValue if key doesn't exist\n get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Remove a value from localStorage\n remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n}\n","import { debounce } from './debounce.js';\nimport { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\nimport { ChatList } from './ChatList.js';\nimport { DownloadChatsButton } from './DownloadChatsButton.js';\nimport { LocalStorage } from './models/LocalStorage.js';\n\nexport class Sidebar {\n constructor() {\n this.settings = new LocalStorage();\n this.chatList = new ChatList();\n this.element = document.getElementById('sidebar');\n this.newChatButton = this.element.querySelector('#new-chat-button');\n this.clearButton = this.element.querySelector('#clear-button');\n this.hamburgerButton = document.getElementById('hamburger-menu');\n this.searchButton = document.getElementById('search-button');\n this.downloadChatsButton = new DownloadChatsButton();\n this.searchRow = document.getElementById('search-row');\n this.searchInput = document.getElementById('search-input');\n if (this.settings.get('sidebar-collapsed') === true) {\n this.element.classList.add('collapsed');\n }\n this.bindEventListeners();\n }\n\n render() {\n this.chatList.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n this.searchButton.addEventListener('click', this.toggleSearch.bind(this));\n this.searchInput.addEventListener(\n 'keypress',\n debounce(this.performSearch.bind(this), 50),\n );\n this.searchInput.addEventListener(\n 'keyup',\n debounce(this.performSearch.bind(this), 50),\n );\n this.newChatButton.addEventListener('click', this.handleNewChat.bind(this));\n this.clearButton.addEventListener('click', this.handleClear.bind(this));\n this.hamburgerButton.addEventListener('click', this.toggle.bind(this));\n }\n\n // TODO: Fix\n handleChatSelected = (chat) => {\n const listItem = this.element.querySelector(`chat${chat.id}`);\n if (listItem) {\n listItem.scrollIntoView({\n behavior: 'smooth',\n block: 'start', // \"start\" will bring the top of the element into view\n inline: 'nearest', // \"nearest\" will scroll to the nearest edge if partially visible\n });\n }\n };\n\n toggleSearch() {\n const searchRow = document.getElementById('search-row');\n searchRow.classList.toggle('hidden');\n this.searchInput.focus();\n }\n\n performSearch() {\n function escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // Escapes special characters\n }\n const query = escapeRegExp(this.searchInput.value.trim()).replace(\n /\\s+/g,\n '.*',\n );\n const queryContent = query.length > 2; // Nobody wants to query content based on one character?\n const regex = new RegExp(query, 'i'); // 'i' for case-insensitive matching\n console.log(`Search ${query}`);\n Chat.getAll().then((chats) => {\n const matches = chats\n .filter((chat) => {\n let match = regex.test(chat.title);\n if (queryContent) {\n match ||= regex.test(chat.content);\n }\n return match;\n })\n .map((chat) => chat.id);\n this.element.querySelectorAll('.chat-list-item').forEach((item) => {\n if (matches.includes(item.data.id)) {\n // Now matches the type\n item.classList.remove('hidden');\n } else {\n item.classList.add('hidden');\n }\n });\n });\n }\n\n toggle() {\n this.element.classList.toggle('collapsed');\n this.hamburgerButton.classList.toggle('collapsed');\n if (this.element.classList.contains('collapsed')) {\n this.settings.set('sidebar-collapsed', true);\n } else {\n this.settings.set('sidebar-collapsed', false);\n }\n }\n\n async handleNewChat() {\n await AppController.createChat();\n }\n\n async handleClear() {\n await AppController.clearChats();\n }\n}\n","import { UINotification } from './UINotification.js';\n\nexport class CopyButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('copy-button')) {\n const targetSelector = event.target.getAttribute('data-target');\n if (!targetSelector) {\n console.error('The data-target attribute is not set');\n return;\n }\n const textToCopy = document.getElementById(targetSelector).innerText;\n // Create a temporary textarea element\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n document.body.appendChild(textarea);\n\n // Select the text and copy it\n textarea.select();\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(textarea);\n\n // Optional: Display a message or change the button text/content\n UINotification.show('Text copied to clipboard').autoDismiss();\n }\n });\n }\n}\n","export class OllamaApi {\n constructor() {\n this.abortController = null;\n }\n\n async send(url, data, onResponse, onError, onDone) {\n const request = { data };\n try {\n const response = await this.postChatMessage(url, data);\n await this.handleResponse(request, response, onResponse, onDone);\n } catch (error) {\n onError(request, error);\n }\n }\n\n async postChatMessage(url, data) {\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n const response = await fetch(url, {\n signal,\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`${url} failed with status ${response.status}`);\n }\n\n return response;\n }\n\n async handleResponse(request, response, onResponse, onDone) {\n const reader = response.body.getReader();\n let partialLine = '';\n var isRequestDone = false;\n\n while (!isRequestDone) {\n const { done, value } = await reader.read();\n if (done) {\n onDone(request, response);\n isRequestDone = true;\n continue;\n }\n\n const textChunk = new TextDecoder().decode(value);\n const lines = (partialLine + textChunk).split('\\n');\n partialLine = lines.pop();\n\n lines.forEach((line) => {\n const responseData = JSON.parse(line);\n if (line.trim()) {\n // TODO: Move this line:\n this.printResponseStats(responseData);\n onResponse(request, responseData.message.content);\n }\n });\n }\n\n if (partialLine.trim()) {\n onResponse(request, partialLine);\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n printResponseStats(data) {\n if (!data.total_duration) {\n return;\n }\n // Convert nanoseconds to seconds for durations\n const totalDurationInSeconds = data.total_duration / 1e9;\n const loadDurationInSeconds = data.load_duration / 1e9;\n const promptEvalDurationInSeconds = data.prompt_eval_duration / 1e9;\n const responseEvalDurationInSeconds = data.eval_duration / 1e9;\n\n // Calculate tokens per second (token/s)\n const tokensPerSecond = data.eval_count / responseEvalDurationInSeconds;\n const output = `\nModel: ${data.model}\nCreated At: ${data.created_at}\nTotal Duration (s): ${totalDurationInSeconds.toFixed(2)}\nLoad Duration (s): ${loadDurationInSeconds.toFixed(2)}\nPrompt Evaluation Count: ${data.prompt_eval_count}\nPrompt Evaluation Duration (s): ${promptEvalDurationInSeconds.toFixed(2)}\nResponse Evaluation Count: ${data.eval_count}\nResponse Evaluation Duration (s): ${responseEvalDurationInSeconds.toFixed(2)}\nTokens Per Second: ${tokensPerSecond.toFixed(2)} token/s\n `;\n console.log(output);\n }\n\n static getModels(url, onResponse) {\n if (!url) {\n return null;\n }\n\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Unable to fetch models from ${url}`);\n }\n return response.json();\n })\n .then((data) => {\n onResponse(data.models);\n })\n .catch((error) => {\n console.debug(error);\n console.error(\n `Please ensure the server is running at: ${url}. Error code: 39847`,\n );\n onResponse([]);\n });\n }\n}\n","export class DownloadButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('download-button')) {\n // Get the index from the data-target attribute\n const targetId = event.target.getAttribute('data-target');\n this.downloadElementContent(targetId, 'chat.html');\n }\n });\n }\n\n downloadElementContent(elementId, filename) {\n // Get the element\n const element = document.getElementById(elementId);\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n // Get the contents of the element\n const content = element.innerText;\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'text/html' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class DropDownMenu {\n constructor() {\n this.buttonSelector = '.drop-down-menu';\n this.dropDownMenus = document.querySelectorAll(this.buttonSelector);\n this.init();\n }\n\n init() {\n // Add a click listener to the whole document\n document.addEventListener('click', (event) => {\n // Check if the clicked element or any of its parents has the 'drop-down-menu' class\n const menuElement = event.target.closest(this.buttonSelector);\n if (menuElement) {\n const dropDownMenu = menuElement.querySelector('.drop-down-menu-items');\n if (dropDownMenu) {\n this.toggleMenu(dropDownMenu);\n }\n }\n });\n }\n\n toggleMenu(menu) {\n menu.classList.toggle('hidden');\n menu.classList.toggle('visible');\n }\n}\n","// Modal base class\nexport class Modal {\n constructor(domId) {\n this.domId = domId;\n this.modal = document.getElementById(this.domId);\n this.closeButton = this.modal.querySelector('.button-close');\n this.closeButton.onclick = () => this.hide();\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n show() {\n this.handleShow();\n }\n\n hide() {\n this.handleHide();\n }\n\n handleShow() {\n this.modal.classList.add('show');\n }\n\n handleHide() {\n this.modal.classList.remove('show');\n }\n}\n","export class List {\n constructor(containerId, items, selected) {\n this.container = document.getElementById(containerId);\n this.items = items;\n this.selected = selected;\n this.render();\n this.clickHandler = null;\n }\n\n onClick(handler) {\n this.clickHandler = handler;\n return this; // Allow chaining\n }\n\n setItems(items) {\n this.items = items;\n this.render();\n }\n\n setSelected(selected) {\n console.debug(`Select ${selected}`);\n this.selected = selected;\n this.render();\n }\n\n getSelected() {\n return this.selected;\n }\n\n render() {\n this.container.innerHTML = ''; // Clear existing content\n const ul = document.createElement('ul');\n ul.classList.add('list');\n this.items.forEach((item) => {\n const li = document.createElement('li');\n li.classList.add('list-item');\n if (item === this.selected) {\n li.classList.add('selected');\n }\n li.textContent = item;\n li.item = item;\n li.addEventListener('click', () => {\n this.setSelected(item);\n if (this.clickHandler) {\n this.clickHandler(item);\n }\n });\n ul.appendChild(li);\n });\n this.container.appendChild(ul);\n }\n}\n","import { Event } from '../Event.js';\nimport { Settings } from './Settings.js';\nimport { OllamaApi } from '../OllamaApi.js';\n\nexport class Models {\n static models = [];\n\n static getUrl() {\n return Settings.getUrl('/api/tags');\n }\n\n static load() {\n if (!this.getUrl()) {\n return null;\n }\n return OllamaApi.getModels(this.getUrl(), (models) => {\n Models.models = models;\n Settings.set('models', Models.models);\n Event.emit('modelsLoaded', Models.models);\n });\n }\n\n static getAll() {\n return Models.models;\n }\n\n static getNames() {\n return Models.models.map((model) => model.name);\n }\n\n static findModelByName(name) {\n return Models.models.find((model) => model.name === name);\n }\n}\n","import { List } from './List.js';\nimport { Event } from './Event.js';\nimport { Models } from './models/Models.js';\n\nexport class ModelsList {\n constructor(selector, selectedModel) {\n this.modelList = new List(selector, Models.getNames(), selectedModel);\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n Event.listen('modelsLoaded', this.handleModelsLoaded.bind(this));\n }\n\n handleModelsLoaded() {\n this.modelList.setItems(Models.getNames());\n }\n\n onClick(handler) {\n this.modelList.clickHandler = handler;\n return this.modelList; // Allow chaining\n }\n\n getSelected() {\n return this.modelList.selected;\n }\n}\n","import { Modal } from './Modal.js';\nimport { UINotification } from './UINotification.js';\nimport { ModelsList } from './ModelsList.js';\nimport { Models } from './models/Models.js';\nimport { Settings } from './models/Settings.js';\n\nexport class SettingsDialog extends Modal {\n constructor() {\n super('settings-dialog');\n this.showButton = document.getElementById('settings-button');\n this.urlInput = document.getElementById('input-url');\n this.modelInput = document.getElementById('input-model');\n this.systemPromptInput = this.modal.querySelector('#input-system-prompt');\n this.modelParametersInput = this.modal.querySelector(\n '#input-model-parameters',\n );\n this.refreshModelsButton = this.modal.querySelector(\n '.refresh-models-button',\n );\n this.modelList = new ModelsList('model-list', Settings.getModel());\n this.bindEventListeners();\n this.loadSettings();\n }\n\n bindEventListeners() {\n this.urlInput.addEventListener('blur', () => {\n const value = this.urlInput.value.trim();\n Settings.setUrl(value);\n });\n this.systemPromptInput.addEventListener('blur', () => {\n Settings.setSystemPrompt(this.systemPromptInput.value.trim());\n });\n this.modelParametersInput.addEventListener('blur', () => {\n const value = this.modelParametersInput.value.trim();\n if (value === '') {\n return;\n }\n try {\n const parsedValue = JSON.parse(value);\n const prettyJSON = JSON.stringify(parsedValue, 2);\n Settings.setModelParameters(parsedValue);\n this.modelParametersInput.value = prettyJSON;\n this.modelParametersInput.classList.remove('error');\n } catch (error) {\n if (error.name === 'SyntaxError') {\n this.modelParametersInput.classList.add('error');\n } else {\n console.error(error);\n }\n }\n });\n this.modelList.onClick(() => {\n Settings.setModel(this.modelList.getSelected());\n });\n this.showButton.addEventListener('click', this.show.bind(this));\n this.refreshModelsButton.onclick = () => this.refreshModels();\n this.closeButton.onclick = () => this.hide();\n }\n\n show() {\n Models.load();\n this.handleShow();\n }\n\n refreshModels() {\n if (!Models.getUrl()) {\n UINotification.show('Please update the URL in the settings to continue.');\n } else {\n Models.load();\n }\n }\n\n loadSettings() {\n this.urlInput.value = Settings.getUrl();\n const modelParameters = Settings.getModelParameters();\n if (modelParameters) {\n this.modelParametersInput.value = JSON.stringify(modelParameters, 2);\n }\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Modal } from './Modal.js';\nimport { Models } from './models/Models.js';\nimport { ModelsList } from './ModelsList.js';\n\nexport class ChatSettingsDialog extends Modal {\n constructor() {\n super('chat-settings-dialog');\n this.showButton = document.getElementById('chat-settings-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.showButton.addEventListener('click', this.show.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n show() {\n Models.load().then(() => {\n AppController.getCurrentChat().then((chat) => {\n this.handleChatSelected(chat);\n this.handleShow();\n });\n });\n }\n\n handleChatSelected(chat) {\n this.modelList = new ModelsList('chat-model-list', chat.model);\n this.modelList.onClick(async (model) => {\n chat.model = model;\n await chat.save();\n });\n }\n}\n","export class ExportChat {\n static exportChat(chat, filename) {\n // Get the contents of the element\n const content = chat.jsonify();\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'application/json' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class Hoverable {\n constructor(element) {\n this.element = element;\n element.hoverable = this;\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', () => this.onMouseover());\n this.element.addEventListener('mouseout', () => this.onMouseout());\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n}\n","import { Event } from './Event.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatTitle {\n constructor() {\n this.defaultTitle = 'Untitled';\n this.element = document.getElementById('chat-title');\n this.bindEventListeners();\n this.render();\n }\n\n render() {\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.setTitle(chat?.title);\n });\n }\n\n setTitle(title) {\n this.element.textContent = title || this.defaultTitle;\n }\n\n focus() {\n const hasFocus = document.activeElement === this.element;\n if (!hasFocus) {\n this.element.focus();\n }\n }\n\n bindEventListeners() {\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n this.element.addEventListener('blur', this.handleSave.bind(this));\n this.element.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.element.blur();\n }\n });\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.setTitle(chat.title);\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat.id) {\n this.setTitle(this.defaultTitle);\n }\n }\n\n async handleSave() {\n let title = this.element.textContent.trim();\n if (title.length === 0) {\n title = this.defaultTitle;\n this.element.classList.add('error');\n } else {\n this.element.classList.remove('error');\n }\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.updateChat(chat, { title });\n } else {\n await AppController.createChat({ title });\n }\n }\n}\n","// TODO: Move code here from App.js\nexport class ChatForm {\n constructor() {\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { AppController } from './AppController.js';\nimport { ExportChat } from './ExportChat.js';\nimport { Event } from './Event.js';\nimport { Hoverable } from './Hoverable.js';\nimport { ChatTitle } from './ChatTitle.js';\nimport { ChatForm } from './ChatForm.js';\n\nexport class ChatArea {\n constructor() {\n this.chatTitle = new ChatTitle();\n this.chatForm = new ChatForm();\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.editChatButton = document.getElementById('edit-chat-button');\n this.scrollToTopButton = document.getElementById('scroll-to-top-button');\n this.scrollToEndButton = document.getElementById('scroll-to-end-button');\n this.deleteChatButton = document.getElementById('delete-chat-button');\n this.exportChatButton = document.getElementById('export-chat-button');\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.render();\n });\n this.bindEventListeners();\n }\n\n render() {\n // Clear history view\n this.chatHistory.innerText = '';\n // Render chat history\n this.chat?.getMessages()?.then((messages) => {\n messages.forEach((message) => {\n this.createMessageDiv(message);\n });\n });\n this.scrollToEnd();\n this.messageInput.focus();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n this.scrollToTopButton.addEventListener(\n 'click',\n this.scrollToTop.bind(this),\n );\n this.scrollToEndButton.addEventListener(\n 'click',\n this.scrollToEnd.bind(this),\n );\n this.editChatButton.addEventListener(\n 'click',\n this.handleEditChat.bind(this),\n );\n this.deleteChatButton.addEventListener(\n 'click',\n this.handleDeleteChat.bind(this),\n );\n this.exportChatButton.addEventListener('click', () => {\n ExportChat.exportChat(this.chat, `chat-${this.chat.id}.json`);\n });\n this.currentMessage = this.chatHistory.querySelector('.selected');\n // Select chat message with arrow up and arrow down keys\n document.addEventListener('keydown', (event) => {\n let next, previous;\n\n if (event.key === 'ArrowDown') {\n next = this.currentMessage\n ? this.currentMessage.nextElementSibling\n : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage\n ? this.currentMessage.previousElementSibling\n : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\n const domId = `chat-message-${message.id}`;\n const role = message.role;\n const content = message.content;\n // Get the template and its content\n const template = document.getElementById('chat-message-template');\n const messageClone = template.content.cloneNode(true);\n // Find the div and span elements within the cloned template\n const messageDiv = messageClone.querySelector('.chat-message');\n const textSpan = messageClone.querySelector('.chat-message-text');\n const deleteButton = messageClone.querySelector(\n '.delete-chat-message-button',\n );\n const copyButton = messageClone.querySelector(\n '.copy-chat-message-button .copy-button',\n );\n const goodButton = messageClone.querySelector('.good-chat-message-button');\n const badButton = messageClone.querySelector('.bad-chat-message-button');\n const flagButton = messageClone.querySelector('.flag-chat-message-button');\n\n if (message.quality == 'bad') {\n badButton.classList.add('selected');\n } else if (message.quality == 'good') {\n goodButton.classList.add('selected');\n } else if (message.quality == 'flagged') {\n flagButton.classList.add('selected');\n }\n\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\n messageDiv.id = domId;\n textSpan.textContent = content;\n messageDiv.spellcheck = false;\n\n // Append to chatHistory and adjust scroll\n this.chatHistory.appendChild(messageDiv);\n messageDiv.dataset['id'] = message.id;\n new Hoverable(messageDiv);\n deleteButton.addEventListener('click', async () => {\n await AppController.deleteChatMessage(message.id);\n messageDiv.remove();\n });\n copyButton.dataset['target'] = domId;\n flagButton.addEventListener('click', async () => {\n UINotification.show('Flagged message').autoDismiss();\n message.quality = 'flagged';\n await message.save();\n });\n goodButton.addEventListener('click', async () => {\n UINotification.show('Marked message as good').autoDismiss();\n message.quality = 'good';\n await message.save();\n });\n badButton.addEventListener('click', async () => {\n UINotification.show('Marked message as bad').autoDismiss();\n message.quality = 'bad';\n await message.save();\n });\n return { element: messageDiv, textElement: textSpan };\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat?.id) {\n this.chat = null;\n } else {\n this.chat = chat;\n }\n this.render();\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.render();\n }\n\n handleEditChat() {\n this.chatTitle.focus();\n event.stopPropagation();\n }\n\n async handleDeleteChat() {\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.deleteChat(chat);\n }\n }\n\n scrollToTop() {\n this.chatHistory.scrollTop = 0;\n }\n\n scrollToEnd() {\n this.chatHistory.scrollTop = this.chatHistory.scrollHeight;\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { Settings } from './models/Settings.js';\nimport { Event } from './Event.js';\nimport { DOM } from './Dom.js';\nimport { Sidebar } from './Sidebar.js';\nimport { AppController } from './AppController.js';\nimport { CopyButton } from './CopyButton.js';\nimport { OllamaApi } from './OllamaApi.js';\nimport { DownloadButton } from './DownloadButton.js';\nimport { DropDownMenu } from './DropDownMenu.js';\nimport { SettingsDialog } from './SettingsDialog.js';\nimport { ChatSettingsDialog } from './ChatSettingsDialog.js';\n// import { MarkdownFormatter } from './MarkdownFormatter.js'\nimport { ChatArea } from './ChatArea.js';\n\n// TODO: Review and refactor\nexport class App {\n static run() {\n UINotification.initialize();\n const app = new App();\n return app;\n }\n\n constructor() {\n this.sidebar = new Sidebar();\n this.chatArea = new ChatArea();\n this.ollamaApi = new OllamaApi();\n this.settingsDialog = new SettingsDialog();\n this.chatSettingsDialog = new ChatSettingsDialog();\n this.downloadButton = new DownloadButton();\n this.copyButton = new CopyButton();\n this.dropDownMenu = new DropDownMenu();\n this.initializeElements();\n this.bindEventListeners();\n this.logInitialization();\n this.render();\n }\n\n initializeElements() {\n // this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n this.messageInput = document.getElementById('message-input');\n this.chatHistory = document.getElementById('chat-history');\n }\n\n logInitialization() {\n const msg = `~~~~\\nChat\\n~~~~\nModel: ${Settings.getModel()}\nURL: ${Settings.getUrl()}\nChat: ${Settings.getCurrentChatId()}\nParameters: ${JSON.stringify(Settings.getModelParameters())}\n`;\n console.log(msg);\n }\n\n render() {\n this.sidebar.render();\n this.chatArea.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n // this.sendButton.addEventListener('click', this.sendMessage.bind(this));\n this.abortButton.addEventListener('click', this.handleAbort.bind(this));\n this.messageInput.addEventListener(\n 'keypress',\n this.handleKeyPress.bind(this),\n );\n }\n\n handleChatSelected = (chat) => {\n window.history.pushState({}, '', `/chats/${chat.id}`);\n };\n\n handleAbort = () => {\n this.ollamaApi.abort();\n this.enableForm();\n console.log('Request aborted');\n };\n\n handleKeyPress = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n this.sendMessage();\n }\n };\n\n enableForm() {\n DOM.hideElement(this.abortButton).enableInput(this.messageInput);\n this.messageInput.focus();\n }\n\n disableForm() {\n DOM.showElement(this.abortButton).disableInput(this.messageInput);\n }\n\n // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion\n async sendMessage() {\n const userPrompt = this.messageInput.value.trim();\n // Get the current chat\n let chat = await AppController.getCurrentChat();\n const url = Settings.getUrl('/api/chat');\n if (!url) {\n UINotification.show(\n 'Please update the URL in the settings to continue. ',\n );\n return null;\n }\n if (userPrompt) {\n // Reset input\n this.messageInput.value = '';\n // Create new chat\n if (!chat) {\n chat = await AppController.createChat({\n title: 'Untitled',\n model: Settings.getModel(),\n });\n }\n // Store user message\n const userMessage = await chat.addMessage({\n role: 'user',\n content: userPrompt,\n });\n const systemMessage = await chat.addMessage({\n role: 'assistant',\n content: '',\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage(userMessage);\n // Create system message container\n const responseElement = this.createChatMessage(systemMessage);\n const requestContext = {\n chat,\n userMessage,\n systemMessage,\n responseElement,\n };\n const requestData = {\n prompt: userMessage,\n model: chat.model,\n messages: (await chat.getMessages()).map((message) => ({\n role: message.role,\n content: message.content,\n })),\n };\n // Add system prompt\n if (systemPrompt) {\n requestData.system = systemPrompt;\n }\n // Add model parameters\n if (modelParameters) {\n requestData.options = modelParameters;\n }\n // Show spinner\n responseElement.textElement.innerHTML = '
';\n // Make request\n this.ollamaApi.send(\n url,\n requestData,\n (request, response) =>\n this.handleResponse(request, response, requestContext),\n (request, error) => this.handleResponseError(request, error),\n (request, response) =>\n this.handleDone(request, response, requestContext),\n );\n }\n }\n\n createChatMessage(message) {\n return this.chatArea.createMessageDiv(message);\n }\n\n handleResponse(request, response, context) {\n const responseElement = context.responseElement;\n const sanitizedContent = this.sanitizeContent(response);\n // Remember original response\n context.systemMessage.content += sanitizedContent;\n responseElement.textElement.textContent += sanitizedContent;\n this.chatArea.scrollToEnd();\n }\n\n handleResponseError(request, error) {\n // Ignore \"Abort\" button\n if (error.name !== 'AbortError') {\n console.error(`Error: ${error.message}`);\n }\n this.chatArea.scrollToEnd();\n this.enableForm();\n }\n\n async handleDone(request, response, context) {\n const chat = context.chat;\n console.log(`Chat ${chat.id} done`);\n await context.systemMessage.save();\n this.enableForm();\n }\n\n sanitizeContent = (content) => {\n // TODO: Sanitization logic here\n return content;\n };\n\n getIdParam = () => {\n return new URL(window.location.href).pathname.split('/').pop();\n };\n}\n","import { App } from './App.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\n// TODO: refactor\nasync function initialize() {\n await Chat.initialize();\n await ChatMessage.initialize();\n}\n\ninitialize().then(() => {\n App.run();\n});\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.css b/dist/theme.7fcc2895.css index 1a33ce6..c0be869 100644 --- a/dist/theme.7fcc2895.css +++ b/dist/theme.7fcc2895.css @@ -202,7 +202,7 @@ html { font-variation-settings: "wght" 900; } -.drop-down-menu-items, #sidebar, .list-item.selected, .hamburger-menu:hover, #chat-header, .active-tab-button, .button-primary { +.drop-down-menu-items, #sidebar, .list-item.selected, .chat-message-menu, .hamburger-menu:hover, #chat-header, .active-tab-button, .button-primary { box-shadow: 0 2px 5px var(--box-shadow-color); } @@ -240,6 +240,10 @@ textarea:focus, justify-content: left; } +.height-100 { + height: 100%; +} + /* Basic Typography */ html * { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Ubuntu, Roboto, "Helvetica Neue", Arial, sans-serif; @@ -287,12 +291,33 @@ svg { vertical-align: middle; } +.user-icon { + margin: 0.25rem 0.75rem 0 0; + width: 2.5rem; /* Adjust the size as needed */ + height: 2.5rem; /* Should be equal to the width for a perfect circle */ + border-radius: 50%; /* This makes the shape a circle */ + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; +} + +.system-icon { + color: var(--text-color); + background-color: var(--tertiary-color); +} + +.you-icon { + background-color: var(--text-color); + color: var(--bg-color); +} + .icon-export::before { content: "🗨⬇"; /* Speech Bubble and Downward Arrow */ } .icon-flag::before { /* Triangular Flag on Post */ - content: "⚠"; + content: "❗"; } .icon-bad::before { @@ -537,6 +562,14 @@ ul { display: flex; flex-direction: column; width: 100%; + /* + li.selected::after { + position: absolute; + right: 1.5rem; + padding-left: 0.5rem; + content: '\203A'; // \00a0 is a non-breaking space + } + */ } ul li { border: 1px solid transparent; /* Invisible border by default */ @@ -564,12 +597,6 @@ ul li button { ul li.selected { border-top-color: rgba(204, 204, 204, 0.368627451); } -ul li.selected::after { - position: absolute; - right: 1rem; - padding-left: 0.5rem; - content: "› "; -} ul li.hover { border-top-color: rgba(204, 204, 204, 0.368627451); } @@ -704,6 +731,8 @@ html { margin: 0; padding: 0; height: 100%; + /* stylelint-disable-next-line property-no-unknown */ + font-smoothing: antialiased; } body { @@ -762,10 +791,12 @@ ul li { } .hoverable { visibility: collapse; + transition: visibility 0s; /* Add a transition for smooth animation */ } .hover .hoverable { visibility: visible; + transition: visibility 0.7s ease-in-out; /* Add a transition for smooth animation */ } .tab-container { @@ -821,7 +852,7 @@ ul li { display: flex; flex-grow: 1; flex-direction: column; - padding: 1rem; + padding: 0.5rem; max-width: 1024px; width: 100%; /* Full width of its parent */ overflow-y: auto; /* Enable vertical scrolling */ @@ -841,10 +872,24 @@ ul li { } /* Styling for user messages */ +.user-chat-message .system-icon { + display: none; +} + /* Styling for system messages */ .assistant-chat-message { margin-bottom: 0.5rem; } +.assistant-chat-message .you-icon { + display: none; +} + +.chat-message-menu { + position: absolute; + padding: 0.5rem; + background: var(--bg-color); + z-index: 300; +} #chat-form { flex: 0 0 60px; /* fixed height */ @@ -975,9 +1020,9 @@ ul li { position: fixed; top: 0; left: 0; - color: var(--bg-color); width: calc(100vw - 2rem); z-index: 30000; + color: var(--text-color); background-color: var(--bg-color); padding: 1rem; margin: 1rem; diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index f3249dc..09ec82d 100644 --- a/dist/theme.7fcc2895.css.map +++ b/dist/theme.7fcc2895.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/reset.scss","css/colors.scss","css/placeholders.scss","css/grid.scss","css/typography.scss","css/icons.scss","css/modal.scss","css/form.scss","css/list.scss","css/button.scss","css/utils.scss","css/spinner.scss","css/style.scss","css/animations.scss","css/responsive.scss","css/Hoverable.scss","css/Tabs.scss","css/ChatApp.scss","css/ChatHeader.scss","css/ChatHistory.scss","css/ChatForm.scss","css/ChatList.scss","css/ChatArea.scss","css/ChatTitle.scss","css/Sidebar.scss","css/DropDownMenu.scss","css/UINotification.scss","css/SpeechBubble.scss"],"names":[],"mappings":"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A;EACE;EACA;;;AAIJ;EACE;;;ACpDF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AClBF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAYJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAGF;IACE;IACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;ACjFJ;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACxBE;EACI;;;AAKR;EACI;;;AAGJ;EACI;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACzBF;EACE;IACE;;;AAIJ;EACE;IACE;;;ACRJ;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC7BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAIJ;AAKA;AACA;EACE;;;ACjCF;EACE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACtCF;EACE;;AAEA;EAEE;;AAOF;EACE;;;AAIJ;EACE;EAIA;;;AAGF;EAGE;;;AC5BF;EACE;EACA;EACA;EACA;;;AAIF;EACE;;;ACTF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EAGE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;ACvBF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAQA;;AANA;EACE;;AAOF;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;ACjCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;ACvBF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"theme.7fcc2895.css","sourceRoot":"..","sourcesContent":["html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol,\nul {\n list-style: none;\n}\n\nblockquote,\nq {\n quotes: none;\n}\n\nblockquote::before,\nblockquote::after,\nq::before,\nq::after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\n// Remove padding of everything and make border-box the default\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nhtml {\n font-size: 14px; /* Standard font size for body, use rem to modify font-size */\n}\n","@use 'sass:color';\n\n// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{color.adjust(#222831, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#222831, $lightness:40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --secondary-bg-color: #f0f0f0;\n --text-color: #333;\n --text-color-lighten-20: #{color.adjust(#eee, $lightness:20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #fff;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #fff;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{color.adjust(#393e46, $lightness:60%)};\n --border-hover-color: #{color.adjust(#393e46, $lightness:40%)};\n --border-focus-color: #{color.adjust(#393e46, $lightness:30%)};\n --box-shadow-color: rgb(196 204 213 / 37%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--primary-color);\n}\n\n// Dark theme for users who prefer dark mode\n@media (prefers-color-scheme: dark) {\n :root {\n --primary-color: #4f5b66;\n --secondary-color: #1c2025;\n --secondary-color-lighten-20: #{color.adjust(#1c2025, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#1c2025, $lightness:40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --secondary-bg-color: #222;\n --text-color: #fafafa;\n --text-color-lighten-20: #{color.adjust(#fafafa, $lightness:20%)};\n --icon-color: var(--text-color);\n --light-text-color: #fff;\n --button-primary-color: #fff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{color.adjust(#4f5b66, $lightness:30%)};\n --border-hover-color: #{color.adjust(#4f5b66, $lightness:50%)};\n --border-focus-color: #{color.adjust(#4f5b66, $lightness:60%)};\n --box-shadow-color: rgb(40 48 57 / 30%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--bg-color);\n }\n}\n","%font-weight-light {\n font-variation-settings: 'wght' 300;\n}\n\n%font-weight-bold {\n font-variation-settings: 'wght' 400;\n}\n\n%font-weight-bolder {\n font-variation-settings: 'wght' 600;\n}\n\n%font-weight-boldest {\n font-variation-settings: 'wght' 900;\n}\n\n%box-shadow {\n box-shadow: 0 2px 5px var(--box-shadow-color);\n}\n\n%box-shadow-hover {\n box-shadow: 2px 0 6px var(--box-shadow-color) inset;\n}\n\n%box-shadow-small {\n box-shadow: 0 5px 10px var(--box-shadow-color);\n}\n\n%box-shadow-modal {\n box-shadow: 0 0 15px var(--box-shadow-modal-color);\n}\n\n%text-title {\n @extend %font-weight-boldest;\n\n font-size: 2rem;\n}\n",".row {\n display: flex; /* Use flexbox layout */\n justify-content: space-between; /* Distribute space evenly between the buttons */\n align-items: center; /* Align items vertically */\n width: 100%; /* Container takes full width */\n}\n\n.grw {\n flex-grow: 1;\n}\n\n.grw-6 {\n flex-grow: 6;\n}\n\n.flex-align-end {\n align-self: flex-end;\n}\n\n.justify-left {\n justify-content: left;\n}\n","/* Basic Typography */\nhtml * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Ubuntu, Roboto,\n 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n font-weight: 600;\n}\n\n/* Heading styles */\nh1 {\n font-size: 2rem;\n}\n\nh2 {\n font-size: 1.5rem;\n}\n\nh3 {\n font-size: 1.25rem;\n}\n",".icon {\n margin-right: 0.25rem;\n}\n\ni[class^='icon-'] {\n color: var(--icon-color);\n font-size: 0.75rem;\n vertical-align: middle;\n filter: grayscale(100%); // Make icons grayscale\n}\n\nsvg {\n width: 1.5rem;\n height: 1.5rem;\n vertical-align: middle;\n}\n\n.icon-export::before {\n content: \"\\1F5E8 \\2B07\"; /* Speech Bubble and Downward Arrow */\n}\n\n.icon-flag::before { /* Triangular Flag on Post */\n content: \"\\26A0\";\n}\n\n.icon-bad::before {\n content: \"\\1F44E\";\n}\n\n.icon-good::before {\n content: \"\\1F44D\";\n}\n\n.icon-close::before {\n content: '\\00D7';\n}\n\n.icon-download::before {\n content: '\\1F4BE';\n}\n\n.icon-copy::before {\n content: '\\1F4CB';\n}\n\n.icon-selected::before {\n content: '\\203A';\n}\n\n.icon-edit::before {\n content: '\\1F58B';\n}\n\n.icon-new::before {\n content: '\\002B';\n font-size: 0.875rem;\n}\n\n.icon-search::before {\n content: '\\1F50D'; /* Unicode character for 🔍 */\n}\n\n.icon-clear::before {\n content: '\\1F5D1'; /* Unicode for wastebasket */\n}\n\n.icon-settings::before {\n content: '\\1F6E0'; /* Unicode for wrench */\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete-alt::before {\n content: '\\274C';\n}\n\n.icon-delete::before {\n content: '\\2716';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n}\n\n.icon-save::before {\n content: '\\1F4BE'; /* Unicode for floppy */\n}\n\n.icon-menu::before {\n content: '\\22EF'; /* Unicode character for three dots */\n}\n\n.icon-user::before {\n content: '\\1F464'; /* Unicode for 👤 */\n}\n\n.icon-robot::before {\n content: '\\1F916'; /* Unicode for 🤖 */\n}\n\n.icon-speech::before {\n content: '\\1F4AC';\n}\n\n.icon-speech2::before {\n content: '\\1F5E8'; /* Unicode for 🗨️ */\n}\n\n.icon-scroll-to-top::before {\n content: '\\21A5';\n}\n\n.icon-scroll-to-end::before {\n content: '\\21A7';\n}\n\n// Light theme\n:root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n\n .icon-settings rect {\n stroke: var(--text-color);\n fill: var(--bg-color);\n }\n}\n\n// Dark theme\n@media (prefers-color-scheme: dark) {\n :root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n }\n}\n\n/*\n.icon-gpt {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjYuNzUiIHI9IjMuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE3LjI1IiBjeT0iNi43NSIgcj0iMy4yNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIxNy4yNSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48L3N2Zz4=');\n}\n\n.icon-models {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+CiAgPHJlY3QgeD0iNC4yNSIgeT0iNC4yNSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9yZWN0PgogIDxyZWN0IHg9IjE0Ljc1IiB5PSI0LjI1IiB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L3JlY3Q+CiAgPHJlY3QgeD0iNC4yNSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KICA8cmVjdCB4PSIxNC43NSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KPC9zdmc+Cg==');\n}\n\n.icon-chats {\n display: inline-block;\n\n //background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjUwIiBoZWlnaHQ9IjMwIiB2aWV3Qm94PSIwIDAgNTAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPCEtLSBSb3VuZGVkIFJlY3RhbmdsZSBmb3IgdGhlIEJ1YmJsZSAtLT4KICA8cmVjdCB4PSIxIiB5PSIxIiB3aWR0aD0iNDgiIGhlaWdodD0iMjAiIHJ4PSIxMCIgcnk9IjEwIiBzdHJva2U9ImJsYWNrIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlLXdpZHRoPSIyIi8+CgogIDwhLS0gVGFpbCBvZiB0aGUgU3BlZWNoIEJ1YmJsZSAtLT4KICA8cGF0aCBkPSJNIDIwLDIxIEwgMjUsMjUgTCAzMCwyMSBaIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=');\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imljb24tbWQiPgogIDxwb2x5Z29uIHBvaW50cz0iNC4yNSw0LjI1IDkuMjUsNC4yNSA2Ljc1LDkuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KICA8cG9seWdvbiBwb2ludHM9IjE0Ljc1LDQuMjUgMTkuNzUsNC4yNSAxNy4yNSw5LjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BvbHlnb24+CiAgPHBvbHlnb24gcG9pbnRzPSI0LjI1LDE0Ljc1IDkuMjUsMTQuNzUgNi43NSwxOS43NSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSI+PC9wb2x5Z29uPgogIDxwb2x5Z29uIHBvaW50cz0iMTQuNzUsMTQuNzUgMTkuNzUsMTQuNzUgMTcuMjUsMTkuNzUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n}\n\n.icon-hamburger {\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDwhLS0gVG9wIFN0cmlwZSAtLT4KICA8cmVjdCB4PSI0IiB5PSI2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBNaWRkbGUgU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjExIiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBCb3R0b20gU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n background-size: contain;\n background-repeat: no-repeat;\n}\n*/\n",".modal {\n display: flex; // Positioned behind other elements so not visible\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgb(0 0 0 / 50%); /* semi-transparent background */\n z-index: -1; /* Start behind other elements */\n overflow: scroll;\n opacity: 0; /* Start invisible */\n pointer-events: none; /* Prevent interaction when modal is not visible */\n}\n\n.modal-header {\n font-weight: 700;\n background-color: var(--modal-header-bg-color);\n padding: 0 1rem;\n border-bottom: 1px solid var(--border-color);\n\n .button {\n color: var(--text-color);\n background-color: var(--bg-color);\n padding: 0.35rem;\n line-height: 0.5rem;\n border-radius: 0.1rem;\n }\n\n .button:hover {\n position: relative;\n top: 1px;\n }\n\n h2 {\n color: var(--light-text-color);\n\n @extend %font-weight-boldest;\n }\n}\n\n.modal-content {\n background: var(--bg-color);\n width: 640px;\n min-width: 320px;\n max-width: 50vw;\n margin: auto; /* Center the modal */\n // border-radius: 2px;\n // overflow: hidden; /* Ensures the border-radius applies to children */\n @extend %box-shadow-modal;\n}\n\n.modal-body {\n padding: 1rem;\n}\n\n.modal.show {\n z-index: 20000;\n opacity: 1; /* Fully visible */\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\n}\n\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n\ninput,\ntextarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n display: inline-block;\n border: 1px solid var(--border-color);\n}\n\ninput.error,\ntextarea.error {\n border: 1px solid var(--error-color) !important;\n}\n\ninput:focus,\ntextarea:focus,\n[contenteditable]:focus {\n border: 1px solid var(--border-color);\n border-color: var(--secondary-color-lighten-40);\n outline: none !important;\n\n @extend %box-shadow-hover;\n}\n\ninput:hover,\ntextarea:hover {\n border: 1px solid var(--secondary-color-lighten-40);\n}\n\n.input {\n margin-bottom: 0.5rem;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\n border: 1px solid transparent; /* Invisible border by default */\n position: relative;\n display: flex; /* Use flexbox layout */\n justify-content: left;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n width: 100%;\n white-space: nowrap; /* Prevent text from wrapping */\n\n .col {\n overflow: hidden; /* Hide overflowing text */\n text-overflow: ''; /* Display ellipsis (...) for overflowing text */\n }\n\n button {\n padding: 0 0.5rem;\n visibility: hidden;\n }\n\n /*\n .list-item-edit:after {\n content: \"...\"; // \\00a0 is a non-breaking space\n }\n */\n }\n\n li.selected {\n @extend %font-weight-boldest;\n\n // NOTE: Should match #chat-header border-bottom\n border-top-color: #cccccc5e;\n }\n\n li.selected::after {\n position: absolute;\n right: 1rem;\n padding-left: 0.5rem;\n content: '\\203A\\00a0'; // \\00a0 is a non-breaking space\n }\n\n li.hover {\n border-top-color: #cccccc5e;\n\n button {\n visibility: visible;\n }\n }\n\n li.hover::after {\n display: none;\n }\n}\n","button {\n background-color: var(--button-secondary-bgcolor);\n z-index: 1;\n border: none;\n cursor: pointer;\n}\n\n.button {\n padding: 0.75rem 1rem;\n\n i {\n display: inline-block;\n }\n\n i[class^='icon-'].selected {\n filter: grayscale(0%); // Make icons normal\n }\n}\n\n.button-sm {\n padding: 0.25rem;\n}\n\n.button:hover,\n.button.selected {\n @extend %box-shadow-hover;\n}\n\n.button-small {\n padding: 0.25rem 1rem;\n}\n\n.button-mini {\n padding: 0;\n}\n\n/* Primary button */\n.button-primary {\n @extend %font-weight-boldest;\n @extend %box-shadow;\n}\n\n.buttons {\n display: flex;\n\n .button {\n border-radius: 0;\n width: 100%;\n }\n}\n\n.button-large {\n padding: 0 2rem;\n}\n","/* Utilities */\n.hidden {\n display: none;\n}\n\n.float-right {\n float: right;\n}\n\n.mt-1 {\n margin-top: 0.5rem;\n}\n\n.d-inline {\n display: inline-block;\n}\n\n.d-block {\n display: block;\n}\n","%spinner {\n border: 2px solid #f3f3f3;\n border-top: 2px solid var(--primary-color);\n border-radius: 50%;\n width: 20px;\n height: 20px;\n animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n%dot {\n width: 1rem;\n height: 1rem;\n background-color: var(--blue);\n border-radius: 50%;\n animation: pulse 2s infinite;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.3);\n opacity: 0.7;\n }\n\n 100% {\n transform: scale(0.9);\n opacity: 0.8;\n }\n}\n\n%dot2 {\n width: 24px;\n height: 24px;\n background-color: blue;\n border-radius: 50%;\n animation:\n pulse 2s infinite,\n change-color 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes change-color {\n 0% {\n background-color: blue;\n }\n\n 33% {\n background-color: red;\n }\n\n 67% {\n background-color: green;\n }\n\n 100% {\n background-color: blue;\n }\n}\n\n.waiting {\n @extend %spinner;\n}\n","/* General styling */\nbody,\nhtml {\n margin: 0;\n padding: 0;\n height: 100%;\n}\n\nbody {\n color: var(--text-color);\n background-color: var(--bg-color);\n}\n\n.chat-link {\n display: inline-block;\n}\n\na {\n text-decoration: none;\n}\n\n.max-width-80 {\n max-width: 80%;\n}\n\n.text-right {\n text-align: right;\n}\n","// Lists\nul {\n li {\n transition: all 0.3s;\n }\n}\n\n// Sidebar\n#sidebar {\n transition: min-width 0.5s ease-out, max-width 1s ease-out;\n}\n\n#sidebar.collapsed {\n transition: min-width 0.5s ease-in, max-width 1s ease-in;\n}\n\n// Modal dialogs\n.modal {\n transform: scale(0.9); /* Start slightly scaled down */\n transition: opacity 0.5s ease, transform 0.5s ease-in; /* Transition effect */\n}\n\n.modal.show {\n transition: opacity 0.5s ease, transform 1s ease-out; /* Transition effect */\n transform: scale(1); /* Scale to original size */\n pointer-events: auto; /* Allow interactions */\n}\n\n","@media (width <= 1024px) {\n html {\n font-size: 0.875rem;\n }\n}\n\n@media (width <= 768px) {\n html {\n font-size: 0.75rem;\n }\n}\n",".hoverable {\n visibility: collapse;\n}\n\n.hover {\n .hoverable {\n visibility: visible;\n }\n}\n",".tab-container {\n display: flex;\n border: 1px solid #ccc;\n}\n\n.tab-button {\n padding: 10px 20px;\n cursor: pointer;\n background-color: #f0f0f0;\n border: none;\n outline: none;\n}\n\n.active-tab-button {\n @extend %box-shadow;\n}\n\n.tab-content {\n display: none;\n}\n","/* Chat app container */\n#chat-app {\n display: flex;\n height: 100vh;\n flex-direction: column;\n}\n","#chat-header {\n // NOTE: Should match #chat-form border-top\n border-bottom: 1px solid #ddd;\n\n @extend %box-shadow;\n\n z-index: 4;\n\n .button {\n height: 100%;\n }\n}\n\n.hamburger-menu {\n cursor: pointer;\n padding-left: 0.75rem;\n padding-right: 0.5rem;\n display: inline-block;\n}\n\n.hamburger-menu:hover {\n @extend %box-shadow;\n}\n\n.hamburger-menu .bar {\n width: 1.5rem;\n height: 2px;\n background-color: #333;\n margin: 6px 0;\n transition: 0.4s;\n}\n","/* Chat history */\n#chat-history {\n mask-image: linear-gradient(180deg, var(--white) 95%, transparent);\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n padding: 1rem;\n max-width: 1024px;\n width: 100%; /* Full width of its parent */\n overflow-y: auto; /* Enable vertical scrolling */\n}\n\n/* Base styling for all messages */\n.chat-message {\n padding: 0.5rem;\n padding-top: 0;\n position: relative;\n\n .drop-down-menu {\n z-index: 100;\n position: absolute;\n top: 0;\n right: 0;\n }\n}\n\n/* Styling for user messages */\n.user-chat-message {\n @extend %font-weight-bolder;\n}\n\n/* Styling for system messages */\n.assistant-chat-message {\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\n\n // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n .textarea {\n height: 100%;\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n .buttons {\n display: flex;\n position: relative;\n height: 100%;\n }\n\n button {\n background-color: var(--bg-color);\n }\n\n textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 1.2rem;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\n\n .chat-title {\n // text-overflow: ellipsis;\n mask-image: linear-gradient(\n 90deg,\n var(--white) 95%,\n transparent\n ); // Fade out title instead of ellipsis\n }\n\n .button {\n padding: 0.25rem 0.75rem;\n }\n}\n\n.list-item.selected {\n background: var(--white);\n\n @extend %box-shadow;\n\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n\n}\n\n#chat-menu-button {\n background-color: var(--secondary-bg-color);\n}\n","#chat-title {\n @extend %font-weight-boldest;\n\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","#sidebar {\n @extend %box-shadow;\n\n background-color: var(--secondary-bg-color);\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n min-width: 0;\n max-width: 0;\n padding: 0;\n}\n",".drop-down-menu {\n position: relative;\n}\n\n.drop-down-menu-items {\n background: var(--bg-color);\n position: absolute;\n top: 100%; /* Position below the button */\n display: none; /* Hide initially */\n font-size: 0.75rem;\n white-space: nowrap;\n\n i[class^='icon-']::before {\n padding-right: 0.5rem;\n }\n\n @extend %box-shadow;\n\n left: 0;\n\n .text {\n padding: 0.5rem;\n }\n}\n\n.drop-down-menu-items.visible {\n z-index: 10000;\n display: inline-block;\n}\n\n.drop-down-menu-right {\n .drop-down-menu-items {\n right: 0 !important;\n left: auto;\n }\n}\n",".notification {\n position: fixed;\n top: 0;\n left: 0;\n color: var(--bg-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n\n @extend %box-shadow-modal;\n\n border-radius: var(--border-radius);\n\n .button {\n border-radius: 2px;\n padding: 0.5rem;\n line-height: 0.5rem;\n }\n}\n\n.notification-error {\n background: var(--error-color);\n}\n",".speech {\n position: relative;\n background: #f0f0f0;\n border: var(--border) solid black;\n padding: 20px;\n border-radius: 10px;\n margin: 40px;\n max-width: 300px;\n}\n\n.speech::after {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 10px 20px 10px 0;\n border-color: transparent #f0f0f0 transparent transparent;\n display: block;\n width: 0;\n z-index: 1;\n left: -20px;\n top: calc(50% - 10px);\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/reset.scss","css/colors.scss","css/placeholders.scss","css/grid.scss","css/typography.scss","css/icons.scss","css/modal.scss","css/form.scss","css/list.scss","css/button.scss","css/utils.scss","css/spinner.scss","css/style.scss","css/animations.scss","css/responsive.scss","css/Hoverable.scss","css/Tabs.scss","css/ChatApp.scss","css/ChatHeader.scss","css/ChatHistory.scss","css/ChatForm.scss","css/ChatList.scss","css/ChatArea.scss","css/ChatTitle.scss","css/Sidebar.scss","css/DropDownMenu.scss","css/UINotification.scss","css/SpeechBubble.scss"],"names":[],"mappings":"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CE;EACA;EACA;EACA;;;AAGF;EACE;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAGF;EACE;;;AAGF;AAMA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;;ACpDF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AClBF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAYJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAGF;IACE;IACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;ACjFJ;AACA;AAAA;EAEE;EACA;EACA;AACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC1BE;EACI;;;AAKR;EACI;;;AAGJ;EACI;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACzBF;EACE;IACE;;;AAIJ;EACE;IACE;;;ACRJ;EACE;EACA;;;AAIA;EACE;EACA;;;ACRJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC7BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAIJ;AAIE;EACE;;;AAIJ;AACA;EACE;;AAEA;EACE;;;AAIJ;EAGE;EACA;EACA;EACA;;;AClDF;EACE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACtCF;EACE;;AAEA;EAEE;;AAOF;EACE;;;AAIJ;EACE;EAIA;;;AAGF;EAGE;;;AC5BF;EACE;EACA;EACA;EACA;;;AAIF;EACE;;;ACTF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EAGE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;ACvBF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAQA;;AANA;EACE;;AAOF;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;ACjCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;ACvBF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"theme.7fcc2895.css","sourceRoot":"..","sourcesContent":["html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol,\nul {\n list-style: none;\n}\n\nblockquote,\nq {\n quotes: none;\n}\n\nblockquote::before,\nblockquote::after,\nq::before,\nq::after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\n// Remove padding of everything and make border-box the default\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nhtml {\n font-size: 14px; /* Standard font size for body, use rem to modify font-size */\n}\n","@use 'sass:color';\n\n// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{color.adjust(#222831, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#222831, $lightness:40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --secondary-bg-color: #f0f0f0;\n --text-color: #333;\n --text-color-lighten-20: #{color.adjust(#eee, $lightness:20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #fff;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #fff;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{color.adjust(#393e46, $lightness:60%)};\n --border-hover-color: #{color.adjust(#393e46, $lightness:40%)};\n --border-focus-color: #{color.adjust(#393e46, $lightness:30%)};\n --box-shadow-color: rgb(196 204 213 / 37%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--primary-color);\n}\n\n// Dark theme for users who prefer dark mode\n@media (prefers-color-scheme: dark) {\n :root {\n --primary-color: #4f5b66;\n --secondary-color: #1c2025;\n --secondary-color-lighten-20: #{color.adjust(#1c2025, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#1c2025, $lightness:40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --secondary-bg-color: #222;\n --text-color: #fafafa;\n --text-color-lighten-20: #{color.adjust(#fafafa, $lightness:20%)};\n --icon-color: var(--text-color);\n --light-text-color: #fff;\n --button-primary-color: #fff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{color.adjust(#4f5b66, $lightness:30%)};\n --border-hover-color: #{color.adjust(#4f5b66, $lightness:50%)};\n --border-focus-color: #{color.adjust(#4f5b66, $lightness:60%)};\n --box-shadow-color: rgb(40 48 57 / 30%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--bg-color);\n }\n}\n","%font-weight-light {\n font-variation-settings: 'wght' 300;\n}\n\n%font-weight-bold {\n font-variation-settings: 'wght' 400;\n}\n\n%font-weight-bolder {\n font-variation-settings: 'wght' 600;\n}\n\n%font-weight-boldest {\n font-variation-settings: 'wght' 900;\n}\n\n%box-shadow {\n box-shadow: 0 2px 5px var(--box-shadow-color);\n}\n\n%box-shadow-hover {\n box-shadow: 2px 0 6px var(--box-shadow-color) inset;\n}\n\n%box-shadow-small {\n box-shadow: 0 5px 10px var(--box-shadow-color);\n}\n\n%box-shadow-modal {\n box-shadow: 0 0 15px var(--box-shadow-modal-color);\n}\n\n%text-title {\n @extend %font-weight-boldest;\n\n font-size: 2rem;\n}\n",".row {\n display: flex; /* Use flexbox layout */\n justify-content: space-between; /* Distribute space evenly between the buttons */\n align-items: center; /* Align items vertically */\n width: 100%; /* Container takes full width */\n}\n\n.grw {\n flex-grow: 1;\n}\n\n.grw-6 {\n flex-grow: 6;\n}\n\n.flex-align-end {\n align-self: flex-end;\n}\n\n.justify-left {\n justify-content: left;\n}\n\n.height-100 {\n height: 100%;\n}\n","/* Basic Typography */\nhtml * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Ubuntu, Roboto,\n 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n font-weight: 600;\n}\n\n/* Heading styles */\nh1 {\n font-size: 2rem;\n}\n\nh2 {\n font-size: 1.5rem;\n}\n\nh3 {\n font-size: 1.25rem;\n}\n",".icon {\n margin-right: 0.25rem;\n}\n\ni[class^='icon-'] {\n color: var(--icon-color);\n font-size: 0.75rem;\n vertical-align: middle;\n filter: grayscale(100%); // Make icons grayscale\n}\n\nsvg {\n width: 1.5rem;\n height: 1.5rem;\n vertical-align: middle;\n}\n\n.user-icon {\n margin: 0.25rem 0.75rem 0 0;\n width: 2.5rem; /* Adjust the size as needed */\n height: 2.5rem; /* Should be equal to the width for a perfect circle */\n border-radius: 50%; /* This makes the shape a circle */\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n}\n\n.system-icon {\n color: var(--text-color);\n background-color: var(--tertiary-color);\n}\n\n.you-icon {\n background-color: var(--text-color);\n color: var(--bg-color);\n}\n\n.icon-export::before {\n content: \"\\1F5E8 \\2B07\"; /* Speech Bubble and Downward Arrow */\n}\n\n.icon-flag::before { /* Triangular Flag on Post */\n content: \"\\2757\";\n}\n\n.icon-bad::before {\n content: \"\\1F44E\";\n}\n\n.icon-good::before {\n content: \"\\1F44D\";\n}\n\n.icon-close::before {\n content: '\\00D7';\n}\n\n.icon-download::before {\n content: '\\1F4BE';\n}\n\n.icon-copy::before {\n content: '\\1F4CB';\n}\n\n.icon-selected::before {\n content: '\\203A';\n}\n\n.icon-edit::before {\n content: '\\1F58B';\n}\n\n.icon-new::before {\n content: '\\002B';\n font-size: 0.875rem;\n}\n\n.icon-search::before {\n content: '\\1F50D'; /* Unicode character for 🔍 */\n}\n\n.icon-clear::before {\n content: '\\1F5D1'; /* Unicode for wastebasket */\n}\n\n.icon-settings::before {\n content: '\\1F6E0'; /* Unicode for wrench */\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete-alt::before {\n content: '\\274C';\n}\n\n.icon-delete::before {\n content: '\\2716';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n}\n\n.icon-save::before {\n content: '\\1F4BE'; /* Unicode for floppy */\n}\n\n.icon-menu::before {\n content: '\\22EF'; /* Unicode character for three dots */\n}\n\n.icon-user::before {\n content: '\\1F464'; /* Unicode for 👤 */\n}\n\n.icon-robot::before {\n content: '\\1F916'; /* Unicode for 🤖 */\n}\n\n.icon-speech::before {\n content: '\\1F4AC';\n}\n\n.icon-speech2::before {\n content: '\\1F5E8'; /* Unicode for 🗨️ */\n}\n\n.icon-scroll-to-top::before {\n content: '\\21A5';\n}\n\n.icon-scroll-to-end::before {\n content: '\\21A7';\n}\n\n// Light theme\n:root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n\n .icon-settings rect {\n stroke: var(--text-color);\n fill: var(--bg-color);\n }\n}\n\n// Dark theme\n@media (prefers-color-scheme: dark) {\n :root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n }\n}\n\n/*\n.icon-gpt {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjYuNzUiIHI9IjMuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE3LjI1IiBjeT0iNi43NSIgcj0iMy4yNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIxNy4yNSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48L3N2Zz4=');\n}\n\n.icon-models {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+CiAgPHJlY3QgeD0iNC4yNSIgeT0iNC4yNSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9yZWN0PgogIDxyZWN0IHg9IjE0Ljc1IiB5PSI0LjI1IiB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L3JlY3Q+CiAgPHJlY3QgeD0iNC4yNSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KICA8cmVjdCB4PSIxNC43NSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KPC9zdmc+Cg==');\n}\n\n.icon-chats {\n display: inline-block;\n\n //background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjUwIiBoZWlnaHQ9IjMwIiB2aWV3Qm94PSIwIDAgNTAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPCEtLSBSb3VuZGVkIFJlY3RhbmdsZSBmb3IgdGhlIEJ1YmJsZSAtLT4KICA8cmVjdCB4PSIxIiB5PSIxIiB3aWR0aD0iNDgiIGhlaWdodD0iMjAiIHJ4PSIxMCIgcnk9IjEwIiBzdHJva2U9ImJsYWNrIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlLXdpZHRoPSIyIi8+CgogIDwhLS0gVGFpbCBvZiB0aGUgU3BlZWNoIEJ1YmJsZSAtLT4KICA8cGF0aCBkPSJNIDIwLDIxIEwgMjUsMjUgTCAzMCwyMSBaIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=');\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imljb24tbWQiPgogIDxwb2x5Z29uIHBvaW50cz0iNC4yNSw0LjI1IDkuMjUsNC4yNSA2Ljc1LDkuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KICA8cG9seWdvbiBwb2ludHM9IjE0Ljc1LDQuMjUgMTkuNzUsNC4yNSAxNy4yNSw5LjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BvbHlnb24+CiAgPHBvbHlnb24gcG9pbnRzPSI0LjI1LDE0Ljc1IDkuMjUsMTQuNzUgNi43NSwxOS43NSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSI+PC9wb2x5Z29uPgogIDxwb2x5Z29uIHBvaW50cz0iMTQuNzUsMTQuNzUgMTkuNzUsMTQuNzUgMTcuMjUsMTkuNzUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n}\n\n.icon-hamburger {\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDwhLS0gVG9wIFN0cmlwZSAtLT4KICA8cmVjdCB4PSI0IiB5PSI2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBNaWRkbGUgU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjExIiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBCb3R0b20gU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n background-size: contain;\n background-repeat: no-repeat;\n}\n*/\n",".modal {\n display: flex; // Positioned behind other elements so not visible\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgb(0 0 0 / 50%); /* semi-transparent background */\n z-index: -1; /* Start behind other elements */\n overflow: scroll;\n opacity: 0; /* Start invisible */\n pointer-events: none; /* Prevent interaction when modal is not visible */\n}\n\n.modal-header {\n font-weight: 700;\n background-color: var(--modal-header-bg-color);\n padding: 0 1rem;\n border-bottom: 1px solid var(--border-color);\n\n .button {\n color: var(--text-color);\n background-color: var(--bg-color);\n padding: 0.35rem;\n line-height: 0.5rem;\n border-radius: 0.1rem;\n }\n\n .button:hover {\n position: relative;\n top: 1px;\n }\n\n h2 {\n color: var(--light-text-color);\n\n @extend %font-weight-boldest;\n }\n}\n\n.modal-content {\n background: var(--bg-color);\n width: 640px;\n min-width: 320px;\n max-width: 50vw;\n margin: auto; /* Center the modal */\n // border-radius: 2px;\n // overflow: hidden; /* Ensures the border-radius applies to children */\n @extend %box-shadow-modal;\n}\n\n.modal-body {\n padding: 1rem;\n}\n\n.modal.show {\n z-index: 20000;\n opacity: 1; /* Fully visible */\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\n}\n\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n\ninput,\ntextarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n display: inline-block;\n border: 1px solid var(--border-color);\n}\n\ninput.error,\ntextarea.error {\n border: 1px solid var(--error-color) !important;\n}\n\ninput:focus,\ntextarea:focus,\n[contenteditable]:focus {\n border: 1px solid var(--border-color);\n border-color: var(--secondary-color-lighten-40);\n outline: none !important;\n\n @extend %box-shadow-hover;\n}\n\ninput:hover,\ntextarea:hover {\n border: 1px solid var(--secondary-color-lighten-40);\n}\n\n.input {\n margin-bottom: 0.5rem;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\n border: 1px solid transparent; /* Invisible border by default */\n position: relative;\n display: flex; /* Use flexbox layout */\n justify-content: left;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n width: 100%;\n white-space: nowrap; /* Prevent text from wrapping */\n\n .col {\n overflow: hidden; /* Hide overflowing text */\n text-overflow: ''; /* Display ellipsis (...) for overflowing text */\n }\n\n button {\n padding: 0 0.5rem;\n visibility: hidden;\n }\n\n /*\n .list-item-edit:after {\n content: \"...\"; // \\00a0 is a non-breaking space\n }\n */\n }\n\n li.selected {\n @extend %font-weight-boldest;\n\n // NOTE: Should match #chat-header border-bottom\n border-top-color: #cccccc5e;\n }\n\n /*\n li.selected::after {\n position: absolute;\n right: 1.5rem;\n padding-left: 0.5rem;\n content: '\\203A'; // \\00a0 is a non-breaking space\n }\n */\n\n li.hover {\n border-top-color: #cccccc5e;\n\n button {\n visibility: visible;\n }\n }\n\n li.hover::after {\n display: none;\n }\n}\n","button {\n background-color: var(--button-secondary-bgcolor);\n z-index: 1;\n border: none;\n cursor: pointer;\n}\n\n.button {\n padding: 0.75rem 1rem;\n\n i {\n display: inline-block;\n }\n\n i[class^='icon-'].selected {\n filter: grayscale(0%); // Make icons normal\n }\n}\n\n.button-sm {\n padding: 0.25rem;\n}\n\n.button:hover,\n.button.selected {\n @extend %box-shadow-hover;\n}\n\n.button-small {\n padding: 0.25rem 1rem;\n}\n\n.button-mini {\n padding: 0;\n}\n\n/* Primary button */\n.button-primary {\n @extend %font-weight-boldest;\n @extend %box-shadow;\n}\n\n.buttons {\n display: flex;\n\n .button {\n border-radius: 0;\n width: 100%;\n }\n}\n\n.button-large {\n padding: 0 2rem;\n}\n","/* Utilities */\n.hidden {\n display: none;\n}\n\n.float-right {\n float: right;\n}\n\n.mt-1 {\n margin-top: 0.5rem;\n}\n\n.d-inline {\n display: inline-block;\n}\n\n.d-block {\n display: block;\n}\n","%spinner {\n border: 2px solid #f3f3f3;\n border-top: 2px solid var(--primary-color);\n border-radius: 50%;\n width: 20px;\n height: 20px;\n animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n%dot {\n width: 1rem;\n height: 1rem;\n background-color: var(--blue);\n border-radius: 50%;\n animation: pulse 2s infinite;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.3);\n opacity: 0.7;\n }\n\n 100% {\n transform: scale(0.9);\n opacity: 0.8;\n }\n}\n\n%dot2 {\n width: 24px;\n height: 24px;\n background-color: blue;\n border-radius: 50%;\n animation:\n pulse 2s infinite,\n change-color 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes change-color {\n 0% {\n background-color: blue;\n }\n\n 33% {\n background-color: red;\n }\n\n 67% {\n background-color: green;\n }\n\n 100% {\n background-color: blue;\n }\n}\n\n.waiting {\n @extend %spinner;\n}\n","/* General styling */\nbody,\nhtml {\n margin: 0;\n padding: 0;\n height: 100%;\n /* stylelint-disable-next-line property-no-unknown */\n font-smoothing: antialiased;\n}\n\nbody {\n color: var(--text-color);\n background-color: var(--bg-color);\n}\n\n.chat-link {\n display: inline-block;\n}\n\na {\n text-decoration: none;\n}\n\n.max-width-80 {\n max-width: 80%;\n}\n\n.text-right {\n text-align: right;\n}\n","// Lists\nul {\n li {\n transition: all 0.3s;\n }\n}\n\n// Sidebar\n#sidebar {\n transition: min-width 0.5s ease-out, max-width 1s ease-out;\n}\n\n#sidebar.collapsed {\n transition: min-width 0.5s ease-in, max-width 1s ease-in;\n}\n\n// Modal dialogs\n.modal {\n transform: scale(0.9); /* Start slightly scaled down */\n transition: opacity 0.5s ease, transform 0.5s ease-in; /* Transition effect */\n}\n\n.modal.show {\n transition: opacity 0.5s ease, transform 1s ease-out; /* Transition effect */\n transform: scale(1); /* Scale to original size */\n pointer-events: auto; /* Allow interactions */\n}\n\n","@media (width <= 1024px) {\n html {\n font-size: 0.875rem;\n }\n}\n\n@media (width <= 768px) {\n html {\n font-size: 0.75rem;\n }\n}\n",".hoverable {\n visibility: collapse;\n transition: visibility 0s; /* Add a transition for smooth animation */\n}\n\n.hover {\n .hoverable {\n visibility: visible;\n transition: visibility 0.7s ease-in-out; /* Add a transition for smooth animation */\n }\n}\n",".tab-container {\n display: flex;\n border: 1px solid #ccc;\n}\n\n.tab-button {\n padding: 10px 20px;\n cursor: pointer;\n background-color: #f0f0f0;\n border: none;\n outline: none;\n}\n\n.active-tab-button {\n @extend %box-shadow;\n}\n\n.tab-content {\n display: none;\n}\n","/* Chat app container */\n#chat-app {\n display: flex;\n height: 100vh;\n flex-direction: column;\n}\n","#chat-header {\n // NOTE: Should match #chat-form border-top\n border-bottom: 1px solid #ddd;\n\n @extend %box-shadow;\n\n z-index: 4;\n\n .button {\n height: 100%;\n }\n}\n\n.hamburger-menu {\n cursor: pointer;\n padding-left: 0.75rem;\n padding-right: 0.5rem;\n display: inline-block;\n}\n\n.hamburger-menu:hover {\n @extend %box-shadow;\n}\n\n.hamburger-menu .bar {\n width: 1.5rem;\n height: 2px;\n background-color: #333;\n margin: 6px 0;\n transition: 0.4s;\n}\n","/* Chat history */\n#chat-history {\n mask-image: linear-gradient(180deg, var(--white) 95%, transparent);\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n padding: 0.5rem;\n max-width: 1024px;\n width: 100%; /* Full width of its parent */\n overflow-y: auto; /* Enable vertical scrolling */\n}\n\n/* Base styling for all messages */\n.chat-message {\n padding: 0.5rem;\n padding-top: 0;\n position: relative;\n\n .drop-down-menu {\n z-index: 100;\n position: absolute;\n top: 0;\n right: 0;\n }\n}\n\n/* Styling for user messages */\n.user-chat-message {\n @extend %font-weight-bolder;\n\n .system-icon {\n display: none;\n }\n}\n\n/* Styling for system messages */\n.assistant-chat-message {\n margin-bottom: 0.5rem;\n\n .you-icon {\n display: none;\n }\n}\n\n.chat-message-menu {\n @extend %box-shadow;\n\n position: absolute;\n padding: 0.5rem;\n background: var(--bg-color);\n z-index: 300;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\n\n // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n .textarea {\n height: 100%;\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n .buttons {\n display: flex;\n position: relative;\n height: 100%;\n }\n\n button {\n background-color: var(--bg-color);\n }\n\n textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 1.2rem;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\n\n .chat-title {\n // text-overflow: ellipsis;\n mask-image: linear-gradient(\n 90deg,\n var(--white) 95%,\n transparent\n ); // Fade out title instead of ellipsis\n }\n\n .button {\n padding: 0.25rem 0.75rem;\n }\n}\n\n.list-item.selected {\n background: var(--white);\n\n @extend %box-shadow;\n\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n\n}\n\n#chat-menu-button {\n background-color: var(--secondary-bg-color);\n}\n","#chat-title {\n @extend %font-weight-boldest;\n\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","#sidebar {\n @extend %box-shadow;\n\n background-color: var(--secondary-bg-color);\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n min-width: 0;\n max-width: 0;\n padding: 0;\n}\n",".drop-down-menu {\n position: relative;\n}\n\n.drop-down-menu-items {\n background: var(--bg-color);\n position: absolute;\n top: 100%; /* Position below the button */\n display: none; /* Hide initially */\n font-size: 0.75rem;\n white-space: nowrap;\n\n i[class^='icon-']::before {\n padding-right: 0.5rem;\n }\n\n @extend %box-shadow;\n\n left: 0;\n\n .text {\n padding: 0.5rem;\n }\n}\n\n.drop-down-menu-items.visible {\n z-index: 10000;\n display: inline-block;\n}\n\n.drop-down-menu-right {\n .drop-down-menu-items {\n right: 0 !important;\n left: auto;\n }\n}\n",".notification {\n position: fixed;\n top: 0;\n left: 0;\n width: calc(100vw - 2rem);\n z-index: 30000;\n color: var(--text-color);\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n\n @extend %box-shadow-modal;\n\n border-radius: var(--border-radius);\n\n .button {\n border-radius: 2px;\n padding: 0.5rem;\n line-height: 0.5rem;\n }\n}\n\n.notification-error {\n background: var(--error-color);\n}\n",".speech {\n position: relative;\n background: #f0f0f0;\n border: var(--border) solid black;\n padding: 20px;\n border-radius: 10px;\n margin: 40px;\n max-width: 300px;\n}\n\n.speech::after {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 10px 20px 10px 0;\n border-color: transparent #f0f0f0 transparent transparent;\n display: block;\n width: 0;\n z-index: 1;\n left: -20px;\n top: calc(50% - 10px);\n}\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js index 10d78e3..5a793b1 100644 --- a/dist/theme.7fcc2895.js +++ b/dist/theme.7fcc2895.js @@ -197,7 +197,7 @@ var parent = module.bundle.parent; if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { var hostname = "" || location.hostname; var protocol = location.protocol === 'https:' ? 'wss' : 'ws'; - var ws = new WebSocket(protocol + '://' + hostname + ':' + "63070" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "61420" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/theme.7fcc2895.js.map b/dist/theme.7fcc2895.js.map index bf2092f..b77a675 100644 --- a/dist/theme.7fcc2895.js.map +++ b/dist/theme.7fcc2895.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/bundle-url.js","../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/css-loader.js","../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/hmr-runtime.js"],"names":["bundleURL","getBundleURLCached","getBundleURL","Error","err","matches","stack","match","getBaseURL","url","replace","exports","bundle","require","updateLink","link","newLink","cloneNode","onload","remove","href","split","Date","now","parentNode","insertBefore","nextSibling","cssTimeout","reloadCSS","setTimeout","links","document","querySelectorAll","i","length","module","OVERLAY_ID","OldModule","Module","moduleName","call","hot","data","hotData","_acceptCallbacks","_disposeCallbacks","accept","fn","push","dispose","checkedAssets","assetsToAccept","parent","isParcelRequire","WebSocket","hostname","location","protocol","ws","onmessage","event","JSON","parse","type","handled","assets","forEach","asset","isNew","didAccept","hmrAcceptCheck","global","parcelRequire","id","every","generated","js","console","clear","hmrApply","v","hmrAcceptRun","reload","close","onclose","log","removeErrorOverlay","error","message","overlay","createErrorOverlay","body","appendChild","getElementById","createElement","stackTrace","innerText","innerHTML","getParents","modules","parents","k","d","dep","Array","isArray","concat","Function","deps","cached","cache","some","cb"],"mappings":"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","file":"theme.7fcc2895.js","sourceRoot":"..","sourcesContent":["var bundleURL = null;\nfunction getBundleURLCached() {\n if (!bundleURL) {\n bundleURL = getBundleURL();\n }\n\n return bundleURL;\n}\n\nfunction getBundleURL() {\n // Attempt to find the URL of the current script and use that as the base URL\n try {\n throw new Error;\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n return getBaseURL(matches[0]);\n }\n }\n\n return '/';\n}\n\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\\/\\/.+)?\\/[^/]+(?:\\?.*)?$/, '$1') + '/';\n}\n\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\n","var bundle = require('./bundle-url');\n\nfunction updateLink(link) {\n var newLink = link.cloneNode();\n newLink.onload = function () {\n link.remove();\n };\n newLink.href = link.href.split('?')[0] + '?' + Date.now();\n link.parentNode.insertBefore(newLink, link.nextSibling);\n}\n\nvar cssTimeout = null;\nfunction reloadCSS() {\n if (cssTimeout) {\n return;\n }\n\n cssTimeout = setTimeout(function () {\n var links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (var i = 0; i < links.length; i++) {\n if (bundle.getBaseURL(links[i].href) === bundle.getBundleURL()) {\n updateLink(links[i]);\n }\n }\n\n cssTimeout = null;\n }, 50);\n}\n\nmodule.exports = reloadCSS;\n","var OVERLAY_ID = '__parcel__error__overlay__';\n\nvar OldModule = module.bundle.Module;\n\nfunction Module(moduleName) {\n OldModule.call(this, moduleName);\n this.hot = {\n data: module.bundle.hotData,\n _acceptCallbacks: [],\n _disposeCallbacks: [],\n accept: function (fn) {\n this._acceptCallbacks.push(fn || function () {});\n },\n dispose: function (fn) {\n this._disposeCallbacks.push(fn);\n }\n };\n\n module.bundle.hotData = null;\n}\n\nmodule.bundle.Module = Module;\nvar checkedAssets, assetsToAccept;\n\nvar parent = module.bundle.parent;\nif ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {\n var hostname = process.env.HMR_HOSTNAME || location.hostname;\n var protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n var ws = new WebSocket(protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/');\n ws.onmessage = function(event) {\n checkedAssets = {};\n assetsToAccept = [];\n\n var data = JSON.parse(event.data);\n\n if (data.type === 'update') {\n var handled = false;\n data.assets.forEach(function(asset) {\n if (!asset.isNew) {\n var didAccept = hmrAcceptCheck(global.parcelRequire, asset.id);\n if (didAccept) {\n handled = true;\n }\n }\n });\n\n // Enable HMR for CSS by default.\n handled = handled || data.assets.every(function(asset) {\n return asset.type === 'css' && asset.generated.js;\n });\n\n if (handled) {\n console.clear();\n\n data.assets.forEach(function (asset) {\n hmrApply(global.parcelRequire, asset);\n });\n\n assetsToAccept.forEach(function (v) {\n hmrAcceptRun(v[0], v[1]);\n });\n } else if (location.reload) { // `location` global exists in a web worker context but lacks `.reload()` function.\n location.reload();\n }\n }\n\n if (data.type === 'reload') {\n ws.close();\n ws.onclose = function () {\n location.reload();\n }\n }\n\n if (data.type === 'error-resolved') {\n console.log('[parcel] ✨ Error resolved');\n\n removeErrorOverlay();\n }\n\n if (data.type === 'error') {\n console.error('[parcel] 🚨 ' + data.error.message + '\\n' + data.error.stack);\n\n removeErrorOverlay();\n\n var overlay = createErrorOverlay(data);\n document.body.appendChild(overlay);\n }\n };\n}\n\nfunction removeErrorOverlay() {\n var overlay = document.getElementById(OVERLAY_ID);\n if (overlay) {\n overlay.remove();\n }\n}\n\nfunction createErrorOverlay(data) {\n var overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n\n // html encode message and stack trace\n var message = document.createElement('div');\n var stackTrace = document.createElement('pre');\n message.innerText = data.error.message;\n stackTrace.innerText = data.error.stack;\n\n overlay.innerHTML = (\n '
' +\n 'ERROR' +\n '🚨' +\n '
' + message.innerHTML + '
' +\n '
' + stackTrace.innerHTML + '
' +\n '
'\n );\n\n return overlay;\n\n}\n\nfunction getParents(bundle, id) {\n var modules = bundle.modules;\n if (!modules) {\n return [];\n }\n\n var parents = [];\n var k, d, dep;\n\n for (k in modules) {\n for (d in modules[k][1]) {\n dep = modules[k][1][d];\n if (dep === id || (Array.isArray(dep) && dep[dep.length - 1] === id)) {\n parents.push(k);\n }\n }\n }\n\n if (bundle.parent) {\n parents = parents.concat(getParents(bundle.parent, id));\n }\n\n return parents;\n}\n\nfunction hmrApply(bundle, asset) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n\n if (modules[asset.id] || !bundle.parent) {\n var fn = new Function('require', 'module', 'exports', asset.generated.js);\n asset.isNew = !modules[asset.id];\n modules[asset.id] = [fn, asset.deps];\n } else if (bundle.parent) {\n hmrApply(bundle.parent, asset);\n }\n}\n\nfunction hmrAcceptCheck(bundle, id) {\n var modules = bundle.modules;\n if (!modules) {\n return;\n }\n\n if (!modules[id] && bundle.parent) {\n return hmrAcceptCheck(bundle.parent, id);\n }\n\n if (checkedAssets[id]) {\n return;\n }\n checkedAssets[id] = true;\n\n var cached = bundle.cache[id];\n\n assetsToAccept.push([bundle, id]);\n\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n return true;\n }\n\n return getParents(global.parcelRequire, id).some(function (id) {\n return hmrAcceptCheck(global.parcelRequire, id)\n });\n}\n\nfunction hmrAcceptRun(bundle, id) {\n var cached = bundle.cache[id];\n bundle.hotData = {};\n if (cached) {\n cached.hot.data = bundle.hotData;\n }\n\n if (cached && cached.hot && cached.hot._disposeCallbacks.length) {\n cached.hot._disposeCallbacks.forEach(function (cb) {\n cb(bundle.hotData);\n });\n }\n\n delete bundle.cache[id];\n bundle(id);\n\n cached = bundle.cache[id];\n if (cached && cached.hot && cached.hot._acceptCallbacks.length) {\n cached.hot._acceptCallbacks.forEach(function (cb) {\n cb();\n });\n return true;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/bundle-url.js","../../../../../usr/local/lib/node_modules/parcel-bundler/src/builtins/css-loader.js"],"names":["bundleURL","getBundleURLCached","getBundleURL","Error","err","matches","stack","match","getBaseURL","url","replace","exports","bundle","require","updateLink","link","newLink","cloneNode","onload","remove","href","split","Date","now","parentNode","insertBefore","nextSibling","cssTimeout","reloadCSS","setTimeout","links","document","querySelectorAll","i","length","module"],"mappings":"AAAA,ACAA,IDAIA,ACAAY,MAAM,GDAG,ACAAC,GDAG,IAAI,ACAA,CAAC,cAAc,CAAC;ADCpC,ACCA,SDDSZ,ACCAa,UAAUA,CAACC,IAAI,EAAE,CDDCd,CAAA,EAAG;EAC5B,ACCA,IDDI,ACCAe,CDDChB,MCCM,GDDG,ACCAe,EDDE,ECCE,CAACE,SAAS,CAAC,CAAC;EAC9BD,EDDEhB,KCCK,CAACkB,GDDG,GAAGhB,ACCA,GAAG,SDDS,CAAC,CAAC,CCCC;EDA7B,ECCEa,IAAI,CAACI,MAAM,CAAC,CAAC;EDCf,ACAA,CAAC,MDAMnB,SAAS;AAClB,ECAEgB,OAAO,CAACI,IAAI,GAAGL,IAAI,CAACK,IAAI,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;ADE3D,ECDER,IAAI,CAACS,EDCEtB,QCDQ,CAACuB,GDCGvB,CAAA,EAAG,MCDM,CAACc,OAAO,EAAED,IAAI,CAACW,WAAW,CAAC;AACzD,EDCE;ACCF,EDAE,ECAEC,EDAE,QCAQ,GAAG,IAAI;AACrB,IDAI,KCAKC,CDAC,IAAIzB,ICAIyB,CDAC,ACAD,CDAA,CAAC,ACAE;EDCnB,ACAA,CDAC,CAAC,ECAED,KDAKvB,GAAG,EAAE,ACAA,EAAE;IDCd,ACAA,IDAIC,OAAO,GAAG,CAAC,EAAE,GAAGD,GAAG,CAACE,KAAK,EAAEC,KAAK,CAAC,+DAA+D,CAAC;ECCvG,EDAE,IAAIF,OAAO,EAAE;ECEfsB,IDDI,MCCM,CDDCnB,ECCEqB,QDDQ,CAACxB,CCCC,CAAC,KDDK,CAAC,CAAC,CAAC,CAAC,GCCG;IDAlC,ACCA,IAAIyB,KAAK,GAAGC,QAAQ,CAACC,gBAAgB,CAAC,wBAAwB,CAAC;EDAjE,ECCE,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;EDCzC,ICAI,GDAG,CCACrB,EDAE,ICAI,CAACJ,UAAU,CAACsB,KAAK,CAACG,CAAC,CAAC,CAACb,IAAI,CAAC,KAAKR,MAAM,CAACV,YAAY,CAAC,CAAC,EAAE;ADCtE,QCAQY,UAAU,CAACgB,KAAK,CAACG,CAAC,CAAC,CAAC;ADE5B,MCDM,GDCGzB,UAAUA,CAACC,GAAG,EAAE;EACvB,ECDE,KDCK,CAAC,EAAE,GAAGA,GAAG,EAAEC,OAAO,CAAC,gFAAgF,EAAE,IAAI,CAAC,GAAG,GAAG;AACzH,ICAIiB,UAAU,GAAG,IAAI;ADErBhB,ECDE,CAAC,EAAE,EDCE,ACDA,CDCCT,ACDA,YDCY,GAAGD,kBAAkB;AACzCU,ACDA,ODCO,CAACH,UAAU,GAAGA,UAAU;ACC/B2B,MAAM,CAACxB,OAAO,GAAGiB,SAAS","file":"theme.7fcc2895.js","sourceRoot":"..","sourcesContent":["var bundleURL = null;\nfunction getBundleURLCached() {\n if (!bundleURL) {\n bundleURL = getBundleURL();\n }\n\n return bundleURL;\n}\n\nfunction getBundleURL() {\n // Attempt to find the URL of the current script and use that as the base URL\n try {\n throw new Error;\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n return getBaseURL(matches[0]);\n }\n }\n\n return '/';\n}\n\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\\/\\/.+)?\\/[^/]+(?:\\?.*)?$/, '$1') + '/';\n}\n\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\n","var bundle = require('./bundle-url');\n\nfunction updateLink(link) {\n var newLink = link.cloneNode();\n newLink.onload = function () {\n link.remove();\n };\n newLink.href = link.href.split('?')[0] + '?' + Date.now();\n link.parentNode.insertBefore(newLink, link.nextSibling);\n}\n\nvar cssTimeout = null;\nfunction reloadCSS() {\n if (cssTimeout) {\n return;\n }\n\n cssTimeout = setTimeout(function () {\n var links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (var i = 0; i < links.length; i++) {\n if (bundle.getBaseURL(links[i].href) === bundle.getBundleURL()) {\n updateLink(links[i]);\n }\n }\n\n cssTimeout = null;\n }, 50);\n}\n\nmodule.exports = reloadCSS;\n"]} \ No newline at end of file diff --git a/index.html b/index.html index fdf02d7..94b8d8b 100644 --- a/index.html +++ b/index.html @@ -250,39 +250,45 @@

Chat settings

diff --git a/js/AppController.js b/js/AppController.js index a2ad900..ad5d831 100644 --- a/js/AppController.js +++ b/js/AppController.js @@ -1,8 +1,10 @@ +import { UINotification } from './UINotification.js'; import { Event } from './Event.js'; import { Chat } from './models/Chat.js'; import { ChatMessage } from './models/ChatMessage.js'; import { Settings } from './models/Settings.js'; +// TODO: Move all actions here? export class AppController { static async updateChat(chat, data) { Object.assign(chat, data); @@ -29,6 +31,7 @@ export class AppController { } static async deleteChatMessage(messageId) { + UINotification.show('Deleted message').autoDismiss(); const message = await ChatMessage.get(messageId); message.delete(); } diff --git a/js/ChatArea.js b/js/ChatArea.js index 25d5636..4c2475f 100644 --- a/js/ChatArea.js +++ b/js/ChatArea.js @@ -1,3 +1,4 @@ +import { UINotification } from './UINotification.js'; import { AppController } from './AppController.js'; import { ExportChat } from './ExportChat.js'; import { Event } from './Event.js'; @@ -139,17 +140,17 @@ export class ChatArea { }); copyButton.dataset['target'] = domId; flagButton.addEventListener('click', async () => { - console.log('flagged'); + UINotification.show('Flagged message').autoDismiss(); message.quality = 'flagged'; await message.save(); }); goodButton.addEventListener('click', async () => { - console.log('good'); + UINotification.show('Marked message as good').autoDismiss(); message.quality = 'good'; await message.save(); }); badButton.addEventListener('click', async () => { - console.log('bad'); + UINotification.show('Marked message as bad').autoDismiss(); message.quality = 'bad'; await message.save(); }); diff --git a/js/CopyButton.js b/js/CopyButton.js index 742bd5c..20a8766 100644 --- a/js/CopyButton.js +++ b/js/CopyButton.js @@ -1,3 +1,5 @@ +import { UINotification } from './UINotification.js'; + export class CopyButton { constructor() { document.addEventListener('click', (event) => { @@ -22,7 +24,7 @@ export class CopyButton { document.body.removeChild(textarea); // Optional: Display a message or change the button text/content - alert('Text copied to clipboard'); + UINotification.show('Text copied to clipboard').autoDismiss(); } }); } diff --git a/js/UINotification.js b/js/UINotification.js index 1637d51..07defbe 100644 --- a/js/UINotification.js +++ b/js/UINotification.js @@ -18,13 +18,16 @@ window.onerror = function (message, source, lineno, colno, error) { */ export class UINotification { - constructor(message, type) { + constructor(message, type, autoDismiss) { const id = simpleHash(JSON.stringify(message)); this.type = type; this.domId = `notification-${id}`; this.container = document.body; this.template = document.getElementById('notification-template').content; this._bindEventListeners(); + if (autoDismiss) { + this.autoDismiss(); + } } _bindEventListeners() { @@ -35,9 +38,16 @@ export class UINotification { }); } + autoDismiss() { + setTimeout(() => { + this.hide(); + }, 2000); // 2000 milliseconds (2 seconds) + } + static show(message, type) { const notification = new UINotification(message, type); notification.show(message); + return notification; } static initialize() { diff --git a/screenshots/chat-collapsed.png b/screenshots/chat-collapsed.png index fc4cc54..312f658 100644 Binary files a/screenshots/chat-collapsed.png and b/screenshots/chat-collapsed.png differ diff --git a/screenshots/chat.png b/screenshots/chat.png index aee357b..9ef7fe9 100644 Binary files a/screenshots/chat.png and b/screenshots/chat.png differ diff --git a/screenshots/mobile-chat-collapsed.png b/screenshots/mobile-chat-collapsed.png index 595d79a..adf1497 100644 Binary files a/screenshots/mobile-chat-collapsed.png and b/screenshots/mobile-chat-collapsed.png differ diff --git a/screenshots/mobile-chat.png b/screenshots/mobile-chat.png index 8863bbf..5507915 100644 Binary files a/screenshots/mobile-chat.png and b/screenshots/mobile-chat.png differ diff --git a/screenshots/mobile-screenshot.png b/screenshots/mobile-screenshot.png index e140e17..c08fbf8 100644 Binary files a/screenshots/mobile-screenshot.png and b/screenshots/mobile-screenshot.png differ diff --git a/screenshots/mobile-search.png b/screenshots/mobile-search.png index bcdf496..a246ef2 100644 Binary files a/screenshots/mobile-search.png and b/screenshots/mobile-search.png differ diff --git a/screenshots/mobile-settings.png b/screenshots/mobile-settings.png index 46c97e1..f610412 100644 Binary files a/screenshots/mobile-settings.png and b/screenshots/mobile-settings.png differ diff --git a/screenshots/screenshot.png b/screenshots/screenshot.png index 1f438d3..f9d79ef 100644 Binary files a/screenshots/screenshot.png and b/screenshots/screenshot.png differ diff --git a/screenshots/search.png b/screenshots/search.png index 888eb5c..2bd55a5 100644 Binary files a/screenshots/search.png and b/screenshots/search.png differ diff --git a/screenshots/settings.png b/screenshots/settings.png index e83c606..f52207b 100644 Binary files a/screenshots/settings.png and b/screenshots/settings.png differ diff --git a/scripts/video.sh b/scripts/video.sh new file mode 100755 index 0000000..2c21361 --- /dev/null +++ b/scripts/video.sh @@ -0,0 +1,3 @@ +#!/bin/sh +ffmpeg -i videos/video.webm -vf "fps=10,scale=1024:-1:flags=lanczos,palettegen" -y palette.png +ffmpeg -i videos/video.webm -i palette.png -filter_complex "fps=10,scale=1024:-1:flags=lanczos[x];[x][1:v]paletteuse" videos/video.gif diff --git a/videos/video.gif b/videos/video.gif index 7dc6e01..b58e9a7 100644 Binary files a/videos/video.gif and b/videos/video.gif differ diff --git a/videos/video.webm b/videos/video.webm index c357967..26262f6 100644 Binary files a/videos/video.webm and b/videos/video.webm differ