From 1ddcfcd5bfc0765437df4a675edfc37ebd845760 Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Sun, 7 Jan 2024 15:42:37 +0200 Subject: [PATCH 1/5] Add "export chats" feature --- README.md | 17 +++++-- css/ChatList.scss | 6 ++- css/button.scss | 1 - css/spinner.scss | 25 ++++++++--- dist/index.html | 3 ++ dist/script.d573be0b.js | 89 +++++++++++++++++++++++++++++++++++-- dist/script.d573be0b.js.map | 2 +- dist/theme.7fcc2895.css.map | 2 +- dist/theme.7fcc2895.js | 2 +- dist/theme.7fcc2895.js.map | 2 +- index.html | 12 ++++- js/App.js | 6 +-- js/App.test.js | 10 ++--- js/DownloadChatsButton.js | 66 +++++++++++++++++++++++++++ js/Sidebar.js | 2 + js/models/BaseModel.js | 7 +++ js/models/Chat.js | 2 + 17 files changed, 224 insertions(+), 30 deletions(-) create mode 100644 js/DownloadChatsButton.js diff --git a/README.md b/README.md index d8a8620..ec73600 100644 --- a/README.md +++ b/README.md @@ -125,19 +125,24 @@ $ parcel build index.html
Tasks + - [ ] Edit message / response - [ ] Clear chat - [ ] CSP - [ ] Speech recognition - [ ] Image upload / multi-modal - [ ] Markdown support - - [ ] Keyboard shortcuts - - [ ] Dark & light theme - [ ] Vote up / down - - [ ] Export chat messages to JSON ## Done + - [x] Export chat messages to JSON + - [x] Keyboard shortcuts + - [x] Dark & light theme + - [x] Export chat messages to JSON + - [x] Keyboard shortcuts + - [x] Keyboard shortcuts + - [x] Dark & light theme - [x] Delete message / response - [x] Ollama chat API / chat memory - [x] IndexedDB persistence @@ -157,11 +162,13 @@ $ parcel build index.html - [x] Abort response - [x] Send message - [x] UI tests: https://nodejs.org/api/test.html +
Features + - https://ollama.ai support **Chat** @@ -178,6 +185,7 @@ $ parcel build index.html - Search chats - Clear chats - Chat history + - Export chats **Settings** @@ -185,11 +193,13 @@ $ parcel build index.html - Model - System prompt - Model parameters +
Licensing + This project is available under two licensing options: 1. **Open Source License (MIT)**: @@ -205,5 +215,6 @@ This project is available under two licensing options: - To inquire about our commercial licensing options, pricing, and terms, please contact us at [christian@aktagon.com](mailto:christian@aktagon.com) to discuss your specific requirements. We value and support both our open source community and commercial users. By providing dual licensing options, we aim to make this project accessible to a wide range of users while offering customized solutions for commercial projects. +
diff --git a/css/ChatList.scss b/css/ChatList.scss index b49acd6..55ed2e2 100644 --- a/css/ChatList.scss +++ b/css/ChatList.scss @@ -2,7 +2,11 @@ z-index: 2; .chat-title { // text-overflow: ellipsis; - mask-image: linear-gradient(90deg, var(--white) 95%, transparent); // Fade out title instead of ellipsis + mask-image: linear-gradient( + 90deg, + var(--white) 95%, + transparent + ); // Fade out title instead of ellipsis } } diff --git a/css/button.scss b/css/button.scss index 10b7e8d..0a5dcce 100644 --- a/css/button.scss +++ b/css/button.scss @@ -58,4 +58,3 @@ button.selected { .button-large { padding: 0 2rem; } - diff --git a/css/spinner.scss b/css/spinner.scss index fec81c9..c3e5ecd 100644 --- a/css/spinner.scss +++ b/css/spinner.scss @@ -36,7 +36,7 @@ } 100% { transform: scale(0.9); - opacity: .8; + opacity: 0.8; } } @@ -45,11 +45,14 @@ height: 24px; background-color: blue; border-radius: 50%; - animation: pulse 2s infinite, changeColor 4s infinite; + animation: + pulse 2s infinite, + changeColor 4s infinite; } @keyframes pulse { - 0%, 100% { + 0%, + 100% { transform: scale(1); opacity: 1; } @@ -60,10 +63,18 @@ } @keyframes changeColor { - 0% { background-color: blue; } - 33% { background-color: red; } - 67% { background-color: green; } - 100% { background-color: blue; } + 0% { + background-color: blue; + } + 33% { + background-color: red; + } + 67% { + background-color: green; + } + 100% { + background-color: blue; + } } .waiting { diff --git a/dist/index.html b/dist/index.html index 4d338b8..8464afd 100644 --- a/dist/index.html +++ b/dist/index.html @@ -48,6 +48,9 @@ + diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index 205f5c9..81582ea 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -564,6 +564,13 @@ class BaseModel { }; }); } + + // Exports the whole store + static async export() { + let transaction = await this.db.transaction(this.storeName, 'readonly'); + let store = await transaction.transaction.objectStore(this.storeName); + return store.getAll(); + } } exports.BaseModel = BaseModel; },{"../Database.js":"js/Database.js","../Migrations.js":"js/Migrations.js"}],"js/models/ChatMessage.js":[function(require,module,exports) { @@ -611,11 +618,15 @@ class Chat extends _BaseModel.BaseModel { } static async get(id) { const chat = await super.get(id); + + /* if (chat) { // Fetch all messages for this chat - const messages = await _ChatMessage.ChatMessage.getAllByChatId(id); + const messages = await ChatMessage.getAllByChatId(id); chat.messages = messages; } + */ + return chat; } static async delete(id) { @@ -876,7 +887,75 @@ class ChatList { } } exports.ChatList = ChatList; -},{"./Event.js":"js/Event.js","./ChatListItem.js":"js/ChatListItem.js","./DragAndDrop.js":"js/DragAndDrop.js","./models/Chat.js":"js/models/Chat.js","./AppController.js":"js/AppController.js"}],"js/models/LocalStorage.js":[function(require,module,exports) { +},{"./Event.js":"js/Event.js","./ChatListItem.js":"js/ChatListItem.js","./DragAndDrop.js":"js/DragAndDrop.js","./models/Chat.js":"js/models/Chat.js","./AppController.js":"js/AppController.js"}],"js/DownloadChatsButton.js":[function(require,module,exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DownloadChatsButton = void 0; +var _Chat = require("./models/Chat.js"); +var _ChatMessage = require("./models/ChatMessage.js"); +class DownloadChatsButton { + constructor() { + this.button = document.querySelector('#export-button'); + this.bindEventListeners(); + } + bindEventListeners() { + this.button.addEventListener('click', () => { + this.exportChat(); + this.exportChatMessages(); + }); + } + async exportChat() { + const request = await _Chat.Chat.export(); + request.onsuccess = function () { + let data = request.result; + + // Convert the data to JSON format + let jsonData = JSON.stringify(data, 2); + + // Export the JSON data by creating a file to download + let blob = new Blob([jsonData], { + type: 'application/json' + }); + let url = URL.createObjectURL(blob); + let a = document.createElement('a'); + a.href = url; + a.download = 'chats.json'; + a.click(); + URL.revokeObjectURL(url); + }; + request.onerror = function (event) { + console.error('Error reading data: ', event.target.errorCode); + }; + } + async exportChatMessages() { + const request = await _ChatMessage.ChatMessage.export(); + request.onsuccess = function () { + let data = request.result; + + // Convert the data to JSON format + let jsonData = JSON.stringify(data, 2); + + // Export the JSON data by creating a file to download + let blob = new Blob([jsonData], { + type: 'application/json' + }); + let url = URL.createObjectURL(blob); + let a = document.createElement('a'); + a.href = url; + a.download = 'chat_messages.json'; + a.click(); + URL.revokeObjectURL(url); + }; + request.onerror = function (event) { + console.error('Error reading data: ', event.target.errorCode); + }; + } +} +exports.DownloadChatsButton = DownloadChatsButton; +},{"./models/Chat.js":"js/models/Chat.js","./models/ChatMessage.js":"js/models/ChatMessage.js"}],"js/models/LocalStorage.js":[function(require,module,exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -928,6 +1007,7 @@ var _Event = require("./Event.js"); var _Chat = require("./models/Chat.js"); var _AppController = require("./AppController.js"); var _ChatList = require("./ChatList.js"); +var _DownloadChatsButton = require("./DownloadChatsButton.js"); var _LocalStorage = require("./models/LocalStorage.js"); class Sidebar { constructor() { @@ -938,6 +1018,7 @@ class Sidebar { this.clearButton = this.element.querySelector('#clear-button'); this.hamburgerButton = document.getElementById('hamburger-menu'); this.searchButton = document.getElementById('search-button'); + this.downloadChatsButton = new _DownloadChatsButton.DownloadChatsButton(); this.searchRow = document.getElementById('search-row'); this.searchInput = document.getElementById('search-input'); if (this.settings.get('sidebar-collapsed') === true) { @@ -1018,7 +1099,7 @@ class Sidebar { } } exports.Sidebar = Sidebar; -},{"./debounce.js":"js/debounce.js","./Event.js":"js/Event.js","./models/Chat.js":"js/models/Chat.js","./AppController.js":"js/AppController.js","./ChatList.js":"js/ChatList.js","./models/LocalStorage.js":"js/models/LocalStorage.js"}],"js/CopyButton.js":[function(require,module,exports) { +},{"./debounce.js":"js/debounce.js","./Event.js":"js/Event.js","./models/Chat.js":"js/models/Chat.js","./AppController.js":"js/AppController.js","./ChatList.js":"js/ChatList.js","./DownloadChatsButton.js":"js/DownloadChatsButton.js","./models/LocalStorage.js":"js/models/LocalStorage.js"}],"js/CopyButton.js":[function(require,module,exports) { "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2005,7 +2086,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 + ':' + "63383" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "49208" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/script.d573be0b.js.map b/dist/script.d573be0b.js.map index b28707f..aba5f61 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/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/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","name","create","save","records","map","getAllByIndexAndId","indexName","index","messages","_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","LocalStorage","_debounce","_ChatList","_LocalStorage","Sidebar","settings","newChatButton","clearButton","hamburgerButton","searchButton","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","createElement","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","blob","Blob","a","createObjectURL","download","click","revokeObjectURL","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAUA,CAACC,GAAG,EAAE;EACvB,IAAIC,IAAI,GAAG,CAAC;EACZ,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,GAAG,CAACG,MAAM,EAAED,CAAC,EAAE,EAAE;IACnC,MAAME,IAAI,GAAGJ,GAAG,CAACK,UAAU,CAACH,CAAC,CAAC;IAC9BD,IAAI,GAAG,CAACA,IAAI,IAAI,CAAC,IAAIA,IAAI,GAAGG,IAAI;IAChCH,IAAI,GAAGA,IAAI,GAAGA,IAAI,CAAC,CAAC;EACtB;EACA,OAAOA,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAMK,cAAc,CAAC;EAC1BC,WAAWA,CAACC,OAAO,EAAEC,IAAI,EAAE;IACzB,MAAMC,EAAE,GAAGX,UAAU,CAACY,IAAI,CAACC,SAAS,CAACJ,OAAO,CAAC,CAAC;IAC9C,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACI,KAAK,GAAI,gBAAeH,EAAG,EAAC;IACjC,IAAI,CAACI,SAAS,GAAGC,QAAQ,CAACC,IAAI;IAC9B,IAAI,CAACC,QAAQ,GAAGF,QAAQ,CAACG,cAAc,CAAC,uBAAuB,CAAC,CAACC,OAAO;IACxE,IAAI,CAACC,mBAAmB,CAAC,CAAC;EAC5B;EAEAA,mBAAmBA,CAAA,EAAG;IACpBC,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAGC,KAAK,IAAK;MAC5C,IAAIA,KAAK,CAACC,GAAG,KAAK,QAAQ,EAAE;QAC1B,IAAI,CAACC,IAAI,CAAC,CAAC;MACb;IACF,CAAC,CAAC;EACJ;EAEA,OAAOC,IAAIA,CAAClB,OAAO,EAAEC,IAAI,EAAE;IACzB,MAAMkB,YAAY,GAAG,IAAIrB,cAAc,CAACE,OAAO,EAAEC,IAAI,CAAC;IACtDkB,YAAY,CAACD,IAAI,CAAClB,OAAO,CAAC;EAC5B;EAEA,OAAOoB,UAAUA,CAAA,EAAG;IAClB;IACA,MAAMC,oBAAoB,GAAGC,OAAO,CAACC,KAAK;;IAE1C;IACAD,OAAO,CAACC,KAAK,GAAG,YAAmB;MAAA,SAAAC,IAAA,GAAAC,SAAA,CAAA9B,MAAA,EAAN+B,IAAI,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;QAAJF,IAAI,CAAAE,IAAA,IAAAH,SAAA,CAAAG,IAAA;MAAA;MAC/B9B,cAAc,CAACoB,IAAI,CAACQ,IAAI,CAAC;MACzB;MACAL,oBAAoB,CAACQ,KAAK,CAACP,OAAO,EAAEI,IAAI,CAAC;IAC3C,CAAC;EACH;EAEA,OAAOI,sBAAsBA,CAACP,KAAK,EAAE;IACnCD,OAAO,CAACS,KAAK,CAAC,cAAc,CAAC;IAC7BT,OAAO,CAACC,KAAK,CAACA,KAAK,CAAC;IACpBzB,cAAc,CAACoB,IAAI,CAACK,KAAK,CAAC;EAC5B;EAEAL,IAAIA,CAAClB,OAAO,EAAE;IACZ;IACA,MAAMgC,KAAK,GAAG,IAAI,CAACvB,QAAQ,CAACwB,SAAS,CAAC,IAAI,CAAC;;IAE3C;IACA,MAAMC,mBAAmB,GAAGF,KAAK,CAACG,aAAa,CAAC,eAAe,CAAC;IAChE,IAAI,CAACD,mBAAmB,EAAE;MACxBZ,OAAO,CAACC,KAAK,CAAC,iDAAiD,CAAC;MAChE;IACF;;IAEA;IACAS,KAAK,CAACG,aAAa,CAAC,uBAAuB,CAAC,CAACC,WAAW,GAAGpC,OAAO;IAElEkC,mBAAmB,CAAChC,EAAE,GAAG,IAAI,CAACG,KAAK,CAAC,CAAC;IACrC;IACA,IAAI,IAAI,CAACJ,IAAI,EAAE;MACbiC,mBAAmB,CAACG,SAAS,CAACC,GAAG,CAAE,gBAAe,IAAI,CAACrC,IAAK,EAAC,CAAC;IAChE;;IAEA;IACA,MAAMsC,WAAW,GAAGP,KAAK,CAACG,aAAa,CAAC,4BAA4B,CAAC;IACrEI,WAAW,CAACC,OAAO,GAAG,MAAM,IAAI,CAACvB,IAAI,CAAC,CAAC;;IAEvC;IACA,IAAI,CAACV,QAAQ,CAACG,cAAc,CAAC,IAAI,CAACL,KAAK,CAAC,EAAE;MACxC;MACA,IAAI,CAACC,SAAS,CAACmC,WAAW,CAACT,KAAK,CAAC;IACnC;EACF;EAEAf,IAAIA,CAAA,EAAG;IACLV,QAAQ,CAACG,cAAc,CAAC,IAAI,CAACL,KAAK,CAAC,EAAEqC,MAAM,CAAC,CAAC;EAC/C;AACF;AAACC,OAAA,CAAA7C,cAAA,GAAAA,cAAA;;;;;;;;AC9FM,MAAM8C,QAAQ,CAAC;EACpB;EACA,OAAOC,GAAGA,CAAC7B,GAAG,EAAE8B,KAAK,EAAE;IACrB,IAAI;MACF,MAAMC,WAAW,GAAG5C,IAAI,CAACC,SAAS,CAAC0C,KAAK,CAAC;MACzCE,YAAY,CAACC,OAAO,CAACjC,GAAG,EAAE+B,WAAW,CAAC;IACxC,CAAC,CAAC,OAAOG,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,8BAA8B,EAAE2B,CAAC,CAAC;IAClD;EACF;;EAEA;EACA,OAAOC,GAAGA,CAACnC,GAAG,EAAuB;IAAA,IAArBoC,YAAY,GAAA3B,SAAA,CAAA9B,MAAA,QAAA8B,SAAA,QAAA4B,SAAA,GAAA5B,SAAA,MAAG,IAAI;IACjC,IAAI;MACF,MAAMqB,KAAK,GAAGE,YAAY,CAACM,OAAO,CAACtC,GAAG,CAAC;MACvC,OAAO8B,KAAK,KAAK,IAAI,GAAG3C,IAAI,CAACoD,KAAK,CAACT,KAAK,CAAC,GAAGM,YAAY;IAC1D,CAAC,CAAC,OAAOF,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,iCAAiC,EAAE2B,CAAC,CAAC;MACnD,OAAOE,YAAY;IACrB;EACF;;EAEA;EACA,OAAOV,MAAMA,CAAC1B,GAAG,EAAE;IACjB,IAAI;MACFgC,YAAY,CAACQ,UAAU,CAACxC,GAAG,CAAC;IAC9B,CAAC,CAAC,OAAOkC,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,kCAAkC,EAAE2B,CAAC,CAAC;IACtD;EACF;EAEA,OAAOO,MAAMA,CAACC,GAAG,EAAE;IACjB,IAAI;MACF,MAAMC,OAAO,GAAGf,QAAQ,CAACO,GAAG,CAAC,KAAK,CAAC;MACnC,IAAIO,GAAG,EAAE;QACP,OAAO,IAAIE,GAAG,CAACF,GAAG,EAAEC,OAAO,CAAC,CAACE,IAAI;MACnC,CAAC,MAAM;QACL,OAAOF,OAAO;MAChB;IACF,CAAC,CAAC,OAAOpC,KAAK,EAAE;MACd,OAAO,IAAI;IACb;EACF;EAEA,OAAOuC,MAAMA,CAACC,GAAG,EAAE;IACjBnB,QAAQ,CAACC,GAAG,CAAC,KAAK,EAAEkB,GAAG,CAAC;EAC1B;EAEA,OAAOC,QAAQA,CAAA,EAAG;IAChB,OAAOpB,QAAQ,CAACO,GAAG,CAAC,OAAO,CAAC;EAC9B;EAEA,OAAOc,QAAQA,CAACC,KAAK,EAAE;IACrBtB,QAAQ,CAACC,GAAG,CAAC,OAAO,EAAEqB,KAAK,CAAC;EAC9B;EAEA,OAAOC,eAAeA,CAAA,EAAG;IACvB,OAAOvB,QAAQ,CAACO,GAAG,CAAC,eAAe,CAAC;EACtC;EAEA,OAAOiB,eAAeA,CAACC,YAAY,EAAE;IACnC,IAAIA,YAAY,KAAK,EAAE,EAAE;MACvBA,YAAY,GAAG,IAAI;IACrB;IACAzB,QAAQ,CAACC,GAAG,CAAC,eAAe,EAAEwB,YAAY,CAAC;EAC7C;EAEA,OAAOC,kBAAkBA,CAAA,EAAG;IAC1B,OAAO1B,QAAQ,CAACO,GAAG,CAAC,kBAAkB,CAAC;EACzC;EAEA,OAAOoB,kBAAkBA,CAACC,eAAe,EAAE;IACzC,IAAIA,eAAe,KAAK,EAAE,EAAE;MAC1BA,eAAe,GAAG,IAAI;IACxB;IACA5B,QAAQ,CAACC,GAAG,CAAC,kBAAkB,EAAE2B,eAAe,CAAC;EACnD;EAEA,OAAOC,gBAAgBA,CAAA,EAAG;IACxB,OAAO7B,QAAQ,CAACO,GAAG,CAAC,eAAe,CAAC;EACtC;EAEA,OAAOuB,gBAAgBA,CAACC,MAAM,EAAE;IAC9B,IAAIA,MAAM,KAAKtB,SAAS,EAAE;MACxBsB,MAAM,GAAG,IAAI;IACf;IACA/B,QAAQ,CAACC,GAAG,CAAC,eAAe,EAAE8B,MAAM,CAAC;EACvC;AACF;AAAChC,OAAA,CAAAC,QAAA,GAAAA,QAAA;;;;;;;;ACxFM,MAAMgC,KAAK,CAAC;EACjB,OAAOC,MAAMA,CAACC,SAAS,EAAEC,OAAO,EAAE;IAChClE,MAAM,CAACC,gBAAgB,CAACgE,SAAS,EAAG/D,KAAK,IAAK;MAC5CgE,OAAO,CAAChE,KAAK,CAACiE,MAAM,CAAC;IACvB,CAAC,CAAC;EACJ;EAEA,OAAOC,IAAIA,CAACH,SAAS,EAAEI,IAAI,EAAE;IAC3B,IAAIC,GAAG,GAAI,GAAEL,SAAU,EAAC;IACxB,IAAII,IAAI,EAAEhF,EAAE,EAAE;MACZiF,GAAG,IAAK,QAAOD,IAAI,CAAChF,EAAG,EAAC;IAC1B;IACAoB,OAAO,CAAC6D,GAAG,CAACA,GAAG,CAAC;IAChB,MAAMpE,KAAK,GAAG,IAAIqE,WAAW,CAACN,SAAS,EAAE;MACvCE,MAAM,EAAEE,IAAI,IAAI,CAAC,CAAC;MAClBG,OAAO,EAAE,IAAI,CAAE;IACjB,CAAC,CAAC;IACFxE,MAAM,CAACyE,aAAa,CAACvE,KAAK,CAAC;EAC7B;AACF;AAAC4B,OAAA,CAAAiC,KAAA,GAAAA,KAAA;;;;;;;;ACnBM,MAAMW,GAAG,CAAC;EACf,OAAOC,WAAWA,CAACC,OAAO,EAAE;IAC1BA,OAAO,CAACpD,SAAS,CAACK,MAAM,CAAC,QAAQ,CAAC;IAClC,OAAO,IAAI;EACb;EAEA,OAAOgD,WAAWA,CAACD,OAAO,EAAE;IAC1BA,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,QAAQ,CAAC;IAC/B,OAAO,IAAI;EACb;EAEA,OAAOqD,WAAWA,CAACF,OAAO,EAAE;IAC1BA,OAAO,CAACG,eAAe,CAAC,UAAU,CAAC;IACnC,OAAO,IAAI;EACb;EAEA,OAAOC,YAAYA,CAACJ,OAAO,EAAE;IAC3BA,OAAO,CAACK,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5C,OAAO,IAAI;EACb;AACF;AAACnD,OAAA,CAAA4C,GAAA,GAAAA,GAAA;;;;;;;;ACpBM,SAASQ,QAAQA,CAACC,IAAI,EAAEC,IAAI,EAAE;EACnC,IAAIC,OAAO;EAEX,OAAO,SAASC,WAAWA,CAAA,EAAU;IAAA,SAAA3E,IAAA,GAAAC,SAAA,CAAA9B,MAAA,EAAN+B,IAAI,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAH,SAAA,CAAAG,IAAA;IAAA;IACjC,MAAMwE,KAAK,GAAGA,CAAA,KAAM;MAClBC,YAAY,CAACH,OAAO,CAAC;MACrBF,IAAI,CAAC,GAAGtE,IAAI,CAAC;IACf,CAAC;IAED2E,YAAY,CAACH,OAAO,CAAC;IACrBA,OAAO,GAAGI,UAAU,CAACF,KAAK,EAAEH,IAAI,CAAC;EACnC,CAAC;AACH;;;;;;;;ACZO,MAAMM,QAAQ,CAAC;EACpBxG,WAAWA,CAACyG,MAAM,EAAEC,YAAY,EAAEC,UAAU,EAAE;IAC5C,IAAI,CAACF,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACE,YAAY,GAAG,IAAI,CAAC,CAAC;IAC1B,IAAI,CAACD,UAAU,GAAGA,UAAU;EAC9B;EAEA,MAAME,IAAIA,CAAA,EAAG;IACX,IAAI,IAAI,CAACD,YAAY,EAAE;MACrB,MAAM,IAAIE,KAAK,CAAC,yBAAyB,CAAC;IAC5C;IAEA,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC,MAAMC,OAAO,GAAGC,SAAS,CAACN,IAAI,CAAC,IAAI,CAACJ,MAAM,EAAE,IAAI,CAACE,UAAU,CAACS,OAAO,CAAC;MAEpEF,OAAO,CAACG,OAAO,GAAIrG,KAAK,IAAKiG,MAAM,CAACjG,KAAK,CAACsG,MAAM,CAAC9F,KAAK,CAAC;MACvD0F,OAAO,CAACK,eAAe,GAAIvG,KAAK,IAAK;QACnC,MAAMwG,EAAE,GAAGxG,KAAK,CAACsG,MAAM,CAACG,MAAM;QAC9B,MAAMC,WAAW,GAAG1G,KAAK,CAAC2G,aAAa,CAACD,WAAW;QACnD,IAAI,CAACf,UAAU,CAACiB,OAAO,CAACJ,EAAE,EAAEE,WAAW,EAAE1G,KAAK,CAAC6G,UAAU,CAAC;MAC5D,CAAC;MACDX,OAAO,CAACY,SAAS,GAAI9G,KAAK,IAAK;QAC7B,IAAI,CAAC4F,YAAY,GAAG5F,KAAK,CAACsG,MAAM,CAACG,MAAM;QACvCT,OAAO,CAAC,IAAI,CAACJ,YAAY,CAAC;MAC5B,CAAC;IACH,CAAC,CAAC;EACJ;EAEA,MAAMc,WAAWA,CAACK,SAAS,EAAEC,IAAI,EAAE;IACjC,OAAO,IAAI,CAACpB,YAAY,CACrBc,WAAW,CAAC,CAACK,SAAS,CAAC,EAAEC,IAAI,CAAC,CAC9BC,WAAW,CAACF,SAAS,CAAC;EAC3B;EAEA,MAAMxF,GAAGA,CAACwF,SAAS,EAAE5C,IAAI,EAAE;IACzB,MAAM+C,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,WAAW,CAAC;IAC5D,OAAO,IAAI,CAACI,aAAa,CAAC,KAAK,EAAED,KAAK,CAAC3F,GAAG,CAAC4C,IAAI,CAAC,CAAC;EACnD;EAEA,MAAM/B,GAAGA,CAAC2E,SAAS,EAAE5H,EAAE,EAAE;IACvB,MAAM+H,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,UAAU,CAAC;IAC3D,OAAO,IAAI,CAACI,aAAa,CAAC,KAAK,EAAED,KAAK,CAAC9E,GAAG,CAACjD,EAAE,CAAC,CAAC;EACjD;EAEA,MAAMiI,GAAGA,CAACL,SAAS,EAAE5C,IAAI,EAAE;IACzB,MAAM+C,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,WAAW,CAAC;IAC5D,OAAO,IAAI,CAACI,aAAa,CAAC,KAAK,EAAED,KAAK,CAACE,GAAG,CAACjD,IAAI,CAAC,CAAC;EACnD;EAEA,MAAMkD,MAAMA,CAACN,SAAS,EAAE5H,EAAE,EAAE;IAC1B,MAAM+H,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,WAAW,CAAC;IAC5D,OAAO,IAAI,CAACI,aAAa,CAAC,QAAQ,EAAED,KAAK,CAACG,MAAM,CAAClI,EAAE,CAAC,CAAC;EACvD;EAEA,MAAMmI,MAAMA,CAACP,SAAS,EAAE;IACtB,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,WAAW,CAAC;IAC5D,OAAO,IAAI,CAACI,aAAa,CAAC,QAAQ,EAAED,KAAK,CAACI,MAAM,CAAC,CAAC,CAAC;EACrD;EAEA,MAAMC,KAAKA,CAACR,SAAS,EAAE;IACrB,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACR,WAAW,CAACK,SAAS,EAAE,WAAW,CAAC;IAC5D,OAAO,IAAI,CAACI,aAAa,CAAC,WAAW,EAAED,KAAK,CAACK,KAAK,CAAC,CAAC,CAAC;EACvD;EAEAJ,aAAaA,CAACjI,IAAI,EAAEgH,OAAO,EAAE;IAC3B,OAAO,IAAIH,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,OAAO,CAACY,SAAS,GAAG,MAAMd,OAAO,CAACE,OAAO,CAACO,MAAM,CAAC;MAEjDP,OAAO,CAACG,OAAO,GAAIrG,KAAK,IAAK;QAC3B,MAAMQ,KAAK,GAAI,YAAWtB,IAAK,sBAAqBc,KAAK,CAACsG,MAAM,CAAC9F,KAAK,CAACvB,OAAQ,EAAC;QAChFgH,MAAM,CAAC,IAAIH,KAAK,CAAC1G,IAAI,CAACC,SAAS,CAACmB,KAAK,CAAC,CAAC,CAAC;MAC1C,CAAC;IACH,CAAC,CAAC;EACJ;AACF;AAACoB,OAAA,CAAA4D,QAAA,GAAAA,QAAA;;;;;;;;AC3EM,MAAMgC,UAAU,CAAC;EACtB,OAAOpB,OAAO,GAAG,CAAC;EAClB,OAAOQ,OAAOA,CAACa,QAAQ,EAAEf,WAAW,EAAEG,UAAU,EAAE;IAChDtG,OAAO,CAACS,KAAK,CACV,iCAAgC6F,UAAW,iBAAgB,IAAI,CAACT,OAAQ,GAC3E,CAAC;IACD,MAAMsB,QAAQ,GAAI,mBAAkB,IAAI,CAACtB,OAAQ,EAAC;IAClD,MAAMuB,WAAW,GAAG,IAAI,CAACD,QAAQ,CAAC;IAClC,IAAI,CAACC,WAAW,EAAE;MAChB,MAAM,IAAI7B,KAAK,CAAE,gCAA+B4B,QAAS,EAAC,CAAC;IAC7D;IACA,IAAI,IAAI,CAACtB,OAAO,IAAIS,UAAU,EAAE;MAC9Bc,WAAW,CAAC;QAAEF,QAAQ;QAAEf;MAAY,CAAC,CAAC;IACxC;EACF;EAEA,OAAOkB,iBAAiBA,CAACC,OAAO,EAAE;IAChC;IACAA,OAAO,CAACJ,QAAQ,CAACK,iBAAiB,CAAC,OAAO,EAAE;MAC1CC,OAAO,EAAE,IAAI;MACbC,aAAa,EAAE;IACjB,CAAC,CAAC;IACF;IACA,MAAMC,YAAY,GAAGJ,OAAO,CAACJ,QAAQ,CAACK,iBAAiB,CAAC,eAAe,EAAE;MACvEC,OAAO,EAAE,IAAI;MACbC,aAAa,EAAE;IACjB,CAAC,CAAC;IACFC,YAAY,CAACC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE;MAAEC,MAAM,EAAE;IAAM,CAAC,CAAC;EAClE;AACF;AAACvG,OAAA,CAAA4F,UAAA,GAAAA,UAAA;;;;;;;;AC7BD,IAAAY,SAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAEO,MAAME,SAAS,CAAC;EACrBvJ,WAAWA,CAACmF,IAAI,EAAE;IAChBqE,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEtE,IAAI,CAAC;EAC3B;EAEA,aAAasD,QAAQA,CAACiB,IAAI,EAAExB,KAAK,EAAE;IACjC,IAAI,CAACzB,MAAM,GAAGiD,IAAI;IAClB,IAAI,CAAC3B,SAAS,GAAGG,KAAK;IACtB,IAAI,CAACV,EAAE,GAAG,IAAIhB,kBAAQ,CAACkD,IAAI,EAAE,CAACxB,KAAK,CAAC,EAAEM,sBAAU,CAAC;IACjD,MAAM,IAAI,CAAChB,EAAE,CAACX,IAAI,CAAC,CAAC;EACtB;EAEA,aAAaa,WAAWA,CAACM,IAAI,EAAE;IAC7B,OAAO,MAAM,IAAI,CAACR,EAAE,CAACE,WAAW,CAAC,IAAI,CAACK,SAAS,EAAEC,IAAI,CAAC;EACxD;EAEA,MAAMN,WAAWA,CAACM,IAAI,EAAE;IACtB,OAAO,MAAM,IAAI,CAAChI,WAAW,CAAC0H,WAAW,CAACM,IAAI,CAAC;EACjD;EAEA,MAAM2B,MAAMA,CAAA,EAAG;IACb,MAAM1I,GAAG,GAAG,MAAM,IAAI,CAACjB,WAAW,CAACwH,EAAE,CAACjF,GAAG,CAAC,IAAI,CAACvC,WAAW,CAAC+H,SAAS,EAAE,IAAI,CAAC;IAC3E,IAAI,CAAC,IAAI,CAAC5H,EAAE,EAAE;MACZ,IAAI,CAACA,EAAE,GAAGc,GAAG;IACf;IACA,OAAO,IAAI;EACb;EAEA,MAAM2I,IAAIA,CAAA,EAAG;IACX,OAAO,MAAM,IAAI,CAAC5J,WAAW,CAACwH,EAAE,CAACY,GAAG,CAAC,IAAI,CAACpI,WAAW,CAAC+H,SAAS,EAAE,IAAI,CAAC;EACxE;EAEA,MAAMM,MAAMA,CAAA,EAAG;IACb,OAAO,MAAM,IAAI,CAACrI,WAAW,CAACwH,EAAE,CAACa,MAAM,CACrC,IAAI,CAACrI,WAAW,CAAC+H,SAAS,EAC1B,IAAI,CAAC5H,EACP,CAAC;EACH;EAEA,aAAaiD,GAAGA,CAACjD,EAAE,EAAE;IACnB,MAAMgF,IAAI,GAAG,MAAM,IAAI,CAACqC,EAAE,CAACpE,GAAG,CAAC,IAAI,CAAC2E,SAAS,EAAE5H,EAAE,CAAC;IAClD,OAAO,IAAI,IAAI,CAACgF,IAAI,CAAC;EACvB;EAEA,aAAaoD,KAAKA,CAAA,EAAG;IACnB,OAAO,MAAM,IAAI,CAACf,EAAE,CAACe,KAAK,CAAC,IAAI,CAACR,SAAS,CAAC;EAC5C;;EAEA;EACA,aAAaO,MAAMA,CAAA,EAAG;IACpB,MAAMuB,OAAO,GAAG,MAAM,IAAI,CAACrC,EAAE,CAACc,MAAM,CAAC,IAAI,CAACP,SAAS,CAAC;IACpD,OAAO8B,OAAO,CAACC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;EAC9C;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,aAAa4E,kBAAkBA,CAACC,SAAS,EAAE7J,EAAE,EAAE;IAC7C;IACA,MAAMuH,WAAW,GAAG,MAAM,IAAI,CAACA,WAAW,CAAC,UAAU,CAAC;;IAEtD;IACA,MAAMuC,KAAK,GAAGvC,WAAW,CAACuC,KAAK,CAACD,SAAS,CAAC;IAC1C,MAAM9C,OAAO,GAAG+C,KAAK,CAAC3B,MAAM,CAACnI,EAAE,CAAC;IAEhC,OAAO,IAAI4G,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,OAAO,CAACY,SAAS,GAAG,MAAM;QACxB;QACA,MAAMoC,QAAQ,GAAGhD,OAAO,CAACO,MAAM,CAACqC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;QAC7D6B,OAAO,CAACkD,QAAQ,CAAC;MACnB,CAAC;MACDhD,OAAO,CAACG,OAAO,GAAG,MAAM;QACtBJ,MAAM,CAACC,OAAO,CAAC1F,KAAK,CAAC;MACvB,CAAC;IACH,CAAC,CAAC;EACJ;AACF;AAACoB,OAAA,CAAA2G,SAAA,GAAAA,SAAA;;;;;;;;AClFD,IAAAY,UAAA,GAAAd,OAAA;AAEO,MAAMe,WAAW,SAASb,oBAAS,CAAC;EACzC,aAAalI,UAAUA,CAAA,EAAG;IACxB,MAAM,IAAI,CAACoH,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;EACjD;EAEA,aAAa4B,cAAcA,CAACzF,MAAM,EAAE;IAClC,OAAO,IAAI,CAACmF,kBAAkB,CAAC,SAAS,EAAEnF,MAAM,CAAC;EACnD;AACF;AAAChC,OAAA,CAAAwH,WAAA,GAAAA,WAAA;;;;;;;;ACVD,IAAAD,UAAA,GAAAd,OAAA;AACA,IAAAiB,YAAA,GAAAjB,OAAA;AAEO,MAAMkB,IAAI,SAAShB,oBAAS,CAAC;EAClC,MAAMiB,UAAUA,CAACrF,IAAI,EAAE;IACrBA,IAAI,CAACP,MAAM,GAAG,IAAI,CAACzE,EAAE;IACrB,MAAM,IAAIiK,wBAAW,CAACjF,IAAI,CAAC,CAACwE,MAAM,CAAC,CAAC;EACtC;EAEA,MAAMc,WAAWA,CAAA,EAAG;IAClB,MAAMP,QAAQ,GAAG,MAAME,wBAAW,CAACC,cAAc,CAAC,IAAI,CAAClK,EAAE,CAAC;IAC1D,IAAI,CAAC+J,QAAQ,GAAGA,QAAQ;IACxB,OAAO,IAAI,CAACA,QAAQ;EACtB;EAEA,aAAa7I,UAAUA,CAAA,EAAG;IACxB,MAAM,IAAI,CAACoH,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;EAC3C;EAEA,aAAaF,KAAKA,CAAA,EAAG;IACnB,MAAM6B,wBAAW,CAAC7B,KAAK,CAAC,CAAC;IACzB,MAAM,KAAK,CAACA,KAAK,CAAC,CAAC;EACrB;EAEA,aAAanF,GAAGA,CAACjD,EAAE,EAAE;IACnB,MAAMuK,IAAI,GAAG,MAAM,KAAK,CAACtH,GAAG,CAACjD,EAAE,CAAC;IAEhC,IAAIuK,IAAI,EAAE;MACR;MACA,MAAMR,QAAQ,GAAG,MAAME,wBAAW,CAACC,cAAc,CAAClK,EAAE,CAAC;MACrDuK,IAAI,CAACR,QAAQ,GAAGA,QAAQ;IAC1B;IAEA,OAAOQ,IAAI;EACb;EAEA,aAAarC,MAAMA,CAAClI,EAAE,EAAE;IACtB;IACA,MAAM,KAAK,CAACkI,MAAM,CAAClI,EAAE,CAAC;;IAEtB;IACA,MAAM+J,QAAQ,GAAG,MAAME,wBAAW,CAACC,cAAc,CAAClK,EAAE,CAAC;IACrD,KAAK,MAAMF,OAAO,IAAIiK,QAAQ,EAAE;MAC9B,MAAMjK,OAAO,CAACoI,MAAM,CAAC,CAAC;IACxB;EACF;AACF;AAACzF,OAAA,CAAA2H,IAAA,GAAAA,IAAA;;;;;;;;AC9CD,IAAAI,MAAA,GAAAtB,OAAA;AACA,IAAAuB,KAAA,GAAAvB,OAAA;AACA,IAAAiB,YAAA,GAAAjB,OAAA;AACA,IAAAwB,SAAA,GAAAxB,OAAA;AAEO,MAAMyB,aAAa,CAAC;EACzB,aAAaC,UAAUA,CAACL,IAAI,EAAEvF,IAAI,EAAE;IAClCqE,MAAM,CAACC,MAAM,CAACiB,IAAI,EAAEvF,IAAI,CAAC;IACzB,MAAMuF,IAAI,CAACd,IAAI,CAAC,CAAC;IACjB;IACA/E,YAAK,CAACK,IAAI,CAAC,aAAa,EAAEwF,IAAI,CAAC;EACjC;EAEA,aAAaM,UAAUA,CAAC7F,IAAI,EAAE;IAC5B,IAAI,CAACA,IAAI,EAAE;MACTA,IAAI,GAAG,CAAC,CAAC;IACX;IACA,IAAI,CAACA,IAAI,CAAC8F,KAAK,EAAE;MACf9F,IAAI,CAAC8F,KAAK,GAAG,UAAU;IACzB;IACA,IAAI,CAAC9F,IAAI,CAAChB,KAAK,EAAE;MACfgB,IAAI,CAAChB,KAAK,GAAGtB,kBAAQ,CAACoB,QAAQ,CAAC,CAAC;IAClC;IACA,MAAMyG,IAAI,GAAG,MAAM,IAAIH,UAAI,CAACpF,IAAI,CAAC,CAACwE,MAAM,CAAC,CAAC;IAC1C9G,kBAAQ,CAAC8B,gBAAgB,CAAC+F,IAAI,CAACvK,EAAE,CAAC;IAClC0E,YAAK,CAACK,IAAI,CAAC,aAAa,EAAEwF,IAAI,CAAC;IAC/B7F,YAAK,CAACK,IAAI,CAAC,cAAc,EAAEwF,IAAI,CAAC;IAChC,OAAOA,IAAI;EACb;EAEA,aAAaQ,iBAAiBA,CAACC,SAAS,EAAE;IACxC,MAAMlL,OAAO,GAAG,MAAMmK,wBAAW,CAAChH,GAAG,CAAC+H,SAAS,CAAC;IAChDlL,OAAO,CAACoI,MAAM,CAAC,CAAC;EAClB;EAEA,aAAa+C,UAAUA,CAACV,IAAI,EAAE;IAC5B,MAAMA,IAAI,CAACrC,MAAM,CAAC,CAAC;IACnB,IAAIxF,kBAAQ,CAAC6B,gBAAgB,CAAC,CAAC,KAAKgG,IAAI,CAACvK,EAAE,EAAE;MAC3C0C,kBAAQ,CAAC8B,gBAAgB,CAAC,IAAI,CAAC;IACjC;IACAE,YAAK,CAACK,IAAI,CAAC,aAAa,EAAEwF,IAAI,CAAC;EACjC;EAEA,aAAaW,cAAcA,CAAA,EAAG;IAC5B,MAAMzG,MAAM,GAAG,IAAI,CAACF,gBAAgB,CAAC,CAAC;IACtC,IAAIE,MAAM,EAAE;MACV,OAAO,MAAM2F,UAAI,CAACnH,GAAG,CAACwB,MAAM,CAAC;IAC/B;IACA,OAAO,IAAI;EACb;EAEA,OAAOF,gBAAgBA,CAAA,EAAG;IACxB,OAAO7B,kBAAQ,CAACO,GAAG,CAAC,eAAe,CAAC;EACtC;EAEA,aAAakI,cAAcA,CAACZ,IAAI,EAAE;IAChC7H,kBAAQ,CAAC8B,gBAAgB,CAAC+F,IAAI,CAACvK,EAAE,CAAC;IAClC0E,YAAK,CAACK,IAAI,CAAC,cAAc,EAAEwF,IAAI,CAAC;EAClC;EAEA,aAAa/F,gBAAgBA,CAACC,MAAM,EAAE;IACpC,MAAM8F,IAAI,GAAG,MAAMH,UAAI,CAACnH,GAAG,CAACwB,MAAM,CAAC;IACnC,IAAI8F,IAAI,EAAE;MACR,MAAM,IAAI,CAACY,cAAc,CAACZ,IAAI,CAAC;IACjC;EACF;EAEA,aAAaa,UAAUA,CAAA,EAAG;IACxB1I,kBAAQ,CAAC8B,gBAAgB,CAAC,IAAI,CAAC;IAC/B,MAAM4F,UAAI,CAAChC,KAAK,CAAC,CAAC;IAClB1D,YAAK,CAACK,IAAI,CAAC,cAAc,CAAC;EAC5B;AACF;AAACtC,OAAA,CAAAkI,aAAA,GAAAA,aAAA;;;;;;;;ACxED,IAAAU,cAAA,GAAAnC,OAAA;AAEO,MAAMoC,YAAY,CAAC;EACxBzL,WAAWA,CAAC0K,IAAI,EAAEgB,QAAQ,EAAEC,QAAQ,EAAE;IACpC,IAAI,CAACjB,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACgB,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAAC9K,OAAO,GAAGJ,QAAQ,CACpBG,cAAc,CAAC,yBAAyB,CAAC,CACzCC,OAAO,CAACsB,SAAS,CAAC,IAAI,CAAC;IAC1B,IAAI,CAACwD,OAAO,GAAG,IAAI,CAAC9E,OAAO,CAACwB,aAAa,CAAC,iBAAiB,CAAC;IAC5D,IAAI,CAACsD,OAAO,CAACuF,KAAK,GAAG,IAAI,CAACP,IAAI,CAACO,KAAK;IACpC,IAAI,CAACvF,OAAO,CAACP,IAAI,GAAG;MAAEhF,EAAE,EAAE,IAAI,CAACuK,IAAI,CAACvK;IAAG,CAAC;IACxC,IAAI,CAACuF,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAE,OAAM,IAAI,CAACmI,IAAI,CAACvK,EAAG,EAAC,CAAC;IACjD,IAAIwL,QAAQ,KAAK,IAAI,EAAE;MACrB,IAAI,CAACjG,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,UAAU,CAAC;MACtC;IACF;IACA,IAAI,CAACqJ,QAAQ,CAAC,CAAC;IACf,IAAI,CAACC,kBAAkB,CAAC,CAAC;EAC3B;EAEAC,MAAMA,CAAA,EAAG,CAAC;EAEVD,kBAAkBA,CAAA,EAAG;IACnB,IAAI,CAACnG,OAAO,CAAC3E,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAACgL,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAACtG,OAAO,CAAC3E,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACkL,UAAU,CAACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CAACtG,OAAO,CAAC3E,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACmL,OAAO,CAACF,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,CAACtG,OAAO,CACTtD,aAAa,CAAC,mBAAmB,CAAC,CAClCrB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACqK,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;EAC1D;EAEAD,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACrG,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;EACrC;EAEA0J,UAAUA,CAAA,EAAG;IACX,IAAI,CAACvG,OAAO,CAACpD,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;EACxC;EAEAuJ,OAAOA,CAAA,EAAG;IACR,IAAI,CAACR,QAAQ,CAACS,UAAU,CAAC,IAAI,CAACzB,IAAI,CAACvK,EAAE,CAAC;EACxC;EAEAyL,QAAQA,CAAA,EAAG;IACT,MAAMQ,SAAS,GAAG,IAAI,CAACxL,OAAO,CAACwB,aAAa,CAAC,aAAa,CAAC;IAC3DgK,SAAS,CAAC/J,WAAW,GAAG,IAAI,CAACqI,IAAI,CAACO,KAAK;EACzC;EAEAG,UAAUA,CAAA,EAAG;IACXN,4BAAa,CAACM,UAAU,CAAC,IAAI,CAACV,IAAI,CAAC;IACnC,IAAI,CAAChF,OAAO,CAAC/C,MAAM,CAAC,CAAC;EACvB;AACF;AAACC,OAAA,CAAA6I,YAAA,GAAAA,YAAA;;;;;;;;ACrDM,MAAMY,WAAW,CAAC;EACvBrM,WAAWA,CAACsM,QAAQ,EAAE;IACpB,IAAI,CAACC,SAAS,GAAG/L,QAAQ,CAACgM,gBAAgB,CAACF,QAAQ,CAAC;IACpD,IAAI,CAACG,WAAW,GAAG,IAAI;IACvB,IAAI,CAACC,qBAAqB,CAAC,CAAC;EAC9B;EAEAA,qBAAqBA,CAAA,EAAG;IACtB,IAAI,CAACH,SAAS,CAACI,OAAO,CAAEC,IAAI,IAAK;MAC/BA,IAAI,CAAC7L,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC8L,eAAe,CAACb,IAAI,CAAC,IAAI,EAAEY,IAAI,CAAC,CAAC;MACzEA,IAAI,CAAC7L,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC+L,cAAc,CAACd,IAAI,CAAC,IAAI,CAAC,CAAC;MACjEY,IAAI,CAAC7L,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAACgM,UAAU,CAACf,IAAI,CAAC,IAAI,EAAEY,IAAI,CAAC,CAAC;MAC/DA,IAAI,CAAC7L,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACiM,aAAa,CAAChB,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC;EACJ;EAEAa,eAAeA,CAACD,IAAI,EAAE;IACpB,IAAI,CAACH,WAAW,GAAGG,IAAI;EACzB;EAEAE,cAAcA,CAAC3J,CAAC,EAAE;IAChBA,CAAC,CAAC8J,cAAc,CAAC,CAAC;EACpB;EAEAF,UAAUA,CAACH,IAAI,EAAE;IACf,IAAIA,IAAI,KAAK,IAAI,CAACH,WAAW,EAAE;MAC7B,IAAIS,WAAW,GAAGN,IAAI,CAACO,SAAS;MAChCP,IAAI,CAACO,SAAS,GAAG,IAAI,CAACV,WAAW,CAACU,SAAS;MAC3C,IAAI,CAACV,WAAW,CAACU,SAAS,GAAGD,WAAW;MACxC3L,OAAO,CAACS,KAAK,CAAC,UAAU,CAAC;IAC3B;EACF;EAEAgL,aAAaA,CAAA,EAAG;IACd,IAAI,CAACP,WAAW,GAAG,IAAI;EACzB;AACF;AAAC7J,OAAA,CAAAyJ,WAAA,GAAAA,WAAA;;;;;;;;ACpCD,IAAA1B,MAAA,GAAAtB,OAAA;AACA,IAAA+D,aAAA,GAAA/D,OAAA;AACA,IAAAgE,YAAA,GAAAhE,OAAA;AACA,IAAAuB,KAAA,GAAAvB,OAAA;AACA,IAAAmC,cAAA,GAAAnC,OAAA;AAEO,MAAMiE,QAAQ,CAAC;EACpBtN,WAAWA,CAAA,EAAG;IACZ,IAAI,CAAC0F,OAAO,GAAGlF,QAAQ,CAACG,cAAc,CAAC,WAAW,CAAC;IACnD,IAAI,CAACD,QAAQ,GAAGF,QAAQ,CAACG,cAAc,CAAC,yBAAyB,CAAC,CAACC,OAAO;IAC1E,IAAI,CAACiL,kBAAkB,CAAC,CAAC;IACzBf,4BAAa,CAACO,cAAc,CAAC,CAAC,CAACkC,IAAI,CAAE7C,IAAI,IAAK;MAC5C,IAAI,CAACA,IAAI,GAAGA,IAAI;IAClB,CAAC,CAAC;EACJ;EAEAmB,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC0I,iBAAiB,CAACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9DnH,YAAK,CAACC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC2I,iBAAiB,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9DnH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC4I,kBAAkB,CAAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChEnH,YAAK,CAACC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC6I,iBAAiB,CAAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9DnH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;EAClE;EAEA,MAAMG,UAAUA,CAACvH,MAAM,EAAE;IACvB,MAAMkG,4BAAa,CAACnG,gBAAgB,CAACC,MAAM,CAAC;EAC9C;EAEA4I,iBAAiBA,CAAC9C,IAAI,EAAE;IACtB,IAAI,CAACmD,UAAU,CAACnD,IAAI,EAAE,IAAI,CAAC;EAC7B;EAEA+C,iBAAiBA,CAAC/C,IAAI,EAAE;IACtB,IAAI,IAAI,CAACA,IAAI,EAAEvK,EAAE,KAAKuK,IAAI,CAACvK,EAAE,EAAE;MAC7B,IAAI,CAACuK,IAAI,GAAG,IAAI;IAClB;IACA,IAAI,CAAChF,OAAO,CAACtD,aAAa,CAAE,QAAOsI,IAAI,CAACvK,EAAG,EAAC,CAAC,EAAEwC,MAAM,CAAC,CAAC;EACzD;EAEA+K,kBAAkBA,CAAA,EAAG;IACnB,MAAMI,QAAQ,GAAG,IAAI,CAACpI,OAAO,CAAC8G,gBAAgB,CAAC,iBAAiB,CAAC;IACjEsB,QAAQ,CAACnB,OAAO,CAAEjH,OAAO,IAAKA,OAAO,CAAC/C,MAAM,CAAC,CAAC,CAAC;EACjD;EAEAgL,iBAAiBA,CAACjD,IAAI,EAAE;IACtB,MAAMqD,WAAW,GAAG,IAAI,CAACrI,OAAO,CAACtD,aAAa,CAC3C,QAAOsI,IAAI,CAACvK,EAAG,cAClB,CAAC;IACD,IAAI4N,WAAW,EAAE;MACfA,WAAW,CAAC1L,WAAW,GAAGqI,IAAI,CAACO,KAAK;IACtC;EACF;EAEA2C,kBAAkBA,CAAClD,IAAI,EAAE;IACvB,IAAI,IAAI,CAACA,IAAI,EAAE;MACb,MAAMsD,mBAAmB,GAAG,IAAI,CAACtI,OAAO,CAACtD,aAAa,CACnD,QAAO,IAAI,CAACsI,IAAI,CAACvK,EAAG,EACvB,CAAC;MACD,IAAI6N,mBAAmB,EAAE;QACvBA,mBAAmB,CAAC1L,SAAS,CAACK,MAAM,CAAC,UAAU,CAAC;MAClD;IACF;IACA,MAAMsL,cAAc,GAAG,IAAI,CAACvI,OAAO,CAACtD,aAAa,CAAE,QAAOsI,IAAI,CAACvK,EAAG,EAAC,CAAC;IACpE,IAAI8N,cAAc,EAAE;MAClBA,cAAc,CAAC3L,SAAS,CAACC,GAAG,CAAC,UAAU,CAAC;IAC1C;IACA;IACA,IAAI,CAACmI,IAAI,GAAGA,IAAI;EAClB;EAEAoB,MAAMA,CAAA,EAAG;IACP,MAAMoC,aAAa,GAAGpD,4BAAa,CAACpG,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAACgB,OAAO,CAACyH,SAAS,GAAG,EAAE;IAC3B5C,UAAI,CAACjC,MAAM,CAAC,CAAC,CAACiF,IAAI,CAAEY,KAAK,IAAK;MAC5BA,KAAK,CAACxB,OAAO,CAAEjC,IAAI,IAAK;QACtB,MAAMiB,QAAQ,GAAGjB,IAAI,CAACvK,EAAE,KAAK+N,aAAa;QAC1C,IAAI,CAACL,UAAU,CAACnD,IAAI,EAAEiB,QAAQ,CAAC;MACjC,CAAC,CAAC;MACF,IAAIU,wBAAW,CAAC,iBAAiB,CAAC;IACpC,CAAC,CAAC;EACJ;EAEAwB,UAAUA,CAACnD,IAAI,EAAEiB,QAAQ,EAAE;IACzB,MAAMyC,YAAY,GAAG,IAAI3C,0BAAY,CAACf,IAAI,EAAE,IAAI,EAAEiB,QAAQ,CAAC;IAC3D,IAAI,CAACjG,OAAO,CAAChD,WAAW,CAAC0L,YAAY,CAAC1I,OAAO,CAAC;IAC9C,OAAO0I,YAAY;EACrB;AACF;AAACxL,OAAA,CAAA0K,QAAA,GAAAA,QAAA;;;;;;;;ACvFM,MAAMe,YAAY,CAAC;EACxB;EACAvL,GAAGA,CAAC7B,GAAG,EAAE8B,KAAK,EAAE;IACd,IAAI;MACF,MAAMC,WAAW,GAAG5C,IAAI,CAACC,SAAS,CAAC0C,KAAK,CAAC;MACzCE,YAAY,CAACC,OAAO,CAACjC,GAAG,EAAE+B,WAAW,CAAC;IACxC,CAAC,CAAC,OAAOG,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,8BAA8B,EAAE2B,CAAC,CAAC;IAClD;EACF;;EAEA;EACAC,GAAGA,CAACnC,GAAG,EAAuB;IAAA,IAArBoC,YAAY,GAAA3B,SAAA,CAAA9B,MAAA,QAAA8B,SAAA,QAAA4B,SAAA,GAAA5B,SAAA,MAAG,IAAI;IAC1B,IAAI;MACF,MAAMqB,KAAK,GAAGE,YAAY,CAACM,OAAO,CAACtC,GAAG,CAAC;MACvC,OAAO8B,KAAK,KAAK,IAAI,GAAG3C,IAAI,CAACoD,KAAK,CAACT,KAAK,CAAC,GAAGM,YAAY;IAC1D,CAAC,CAAC,OAAOF,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,iCAAiC,EAAE2B,CAAC,CAAC;MACnD,OAAOE,YAAY;IACrB;EACF;;EAEA;EACAV,MAAMA,CAAC1B,GAAG,EAAE;IACV,IAAI;MACFgC,YAAY,CAACQ,UAAU,CAACxC,GAAG,CAAC;IAC9B,CAAC,CAAC,OAAOkC,CAAC,EAAE;MACV5B,OAAO,CAACC,KAAK,CAAC,kCAAkC,EAAE2B,CAAC,CAAC;IACtD;EACF;AACF;AAACP,OAAA,CAAAyL,YAAA,GAAAA,YAAA;;;;;;;;AC9BD,IAAAC,SAAA,GAAAjF,OAAA;AACA,IAAAsB,MAAA,GAAAtB,OAAA;AACA,IAAAuB,KAAA,GAAAvB,OAAA;AACA,IAAAmC,cAAA,GAAAnC,OAAA;AACA,IAAAkF,SAAA,GAAAlF,OAAA;AACA,IAAAmF,aAAA,GAAAnF,OAAA;AAEO,MAAMoF,OAAO,CAAC;EACnBzO,WAAWA,CAAA,EAAG;IACZ,IAAI,CAAC0O,QAAQ,GAAG,IAAIL,0BAAY,CAAC,CAAC;IAClC,IAAI,CAAC3C,QAAQ,GAAG,IAAI4B,kBAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC5H,OAAO,GAAGlF,QAAQ,CAACG,cAAc,CAAC,SAAS,CAAC;IACjD,IAAI,CAACgO,aAAa,GAAG,IAAI,CAACjJ,OAAO,CAACtD,aAAa,CAAC,kBAAkB,CAAC;IACnE,IAAI,CAACwM,WAAW,GAAG,IAAI,CAAClJ,OAAO,CAACtD,aAAa,CAAC,eAAe,CAAC;IAC9D,IAAI,CAACyM,eAAe,GAAGrO,QAAQ,CAACG,cAAc,CAAC,gBAAgB,CAAC;IAChE,IAAI,CAACmO,YAAY,GAAGtO,QAAQ,CAACG,cAAc,CAAC,eAAe,CAAC;IAC5D,IAAI,CAACoO,SAAS,GAAGvO,QAAQ,CAACG,cAAc,CAAC,YAAY,CAAC;IACtD,IAAI,CAACqO,WAAW,GAAGxO,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;IAC1D,IAAI,IAAI,CAAC+N,QAAQ,CAACtL,GAAG,CAAC,mBAAmB,CAAC,KAAK,IAAI,EAAE;MACnD,IAAI,CAACsC,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,WAAW,CAAC;IACzC;IACA,IAAI,CAACsJ,kBAAkB,CAAC,CAAC;EAC3B;EAEAC,MAAMA,CAAA,EAAG;IACP,IAAI,CAACJ,QAAQ,CAACI,MAAM,CAAC,CAAC;EACxB;EAEAD,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC;IACrD,IAAI,CAACkB,YAAY,CAAC/N,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACkO,YAAY,CAACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,CAACgD,WAAW,CAACjO,gBAAgB,CAC/B,UAAU,EACV,IAAAiF,kBAAQ,EAAC,IAAI,CAACkJ,aAAa,CAAClD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;IACD,IAAI,CAACgD,WAAW,CAACjO,gBAAgB,CAC/B,OAAO,EACP,IAAAiF,kBAAQ,EAAC,IAAI,CAACkJ,aAAa,CAAClD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;IACD,IAAI,CAAC2C,aAAa,CAAC5N,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACoO,aAAa,CAACnD,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,IAAI,CAAC4C,WAAW,CAAC7N,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACqO,WAAW,CAACpD,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC6C,eAAe,CAAC9N,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACsO,MAAM,CAACrD,IAAI,CAAC,IAAI,CAAC,CAAC;EACxE;;EAEA;EACA4B,kBAAkB,GAAIlD,IAAI,IAAK;IAC7B,MAAM4E,QAAQ,GAAG,IAAI,CAAC5J,OAAO,CAACtD,aAAa,CAAE,OAAMsI,IAAI,CAACvK,EAAG,EAAC,CAAC;IAC7D,IAAImP,QAAQ,EAAE;MACZA,QAAQ,CAACC,cAAc,CAAC;QACtBC,QAAQ,EAAE,QAAQ;QAClBC,KAAK,EAAE,OAAO;QAAE;QAChBC,MAAM,EAAE,SAAS,CAAE;MACrB,CAAC,CAAC;IACJ;EACF,CAAC;EAEDT,YAAYA,CAAA,EAAG;IACb,MAAMF,SAAS,GAAGvO,QAAQ,CAACG,cAAc,CAAC,YAAY,CAAC;IACvDoO,SAAS,CAACzM,SAAS,CAAC+M,MAAM,CAAC,QAAQ,CAAC;IACpC,IAAI,CAACL,WAAW,CAACW,KAAK,CAAC,CAAC;EAC1B;EAEAT,aAAaA,CAAA,EAAG;IACd,SAASU,YAAYA,CAACC,MAAM,EAAE;MAC5B,OAAOA,MAAM,CAACC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD;IACA,MAAMC,KAAK,GAAGH,YAAY,CAAC,IAAI,CAACZ,WAAW,CAACjM,KAAK,CAACiN,IAAI,CAAC,CAAC,CAAC,CAACF,OAAO,CAC/D,MAAM,EACN,IACF,CAAC;IACD,MAAMG,YAAY,GAAGF,KAAK,CAACnQ,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,MAAMsQ,KAAK,GAAG,IAAIC,MAAM,CAACJ,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACtCxO,OAAO,CAAC6D,GAAG,CAAE,UAAS2K,KAAM,EAAC,CAAC;IAC9BxF,UAAI,CAACjC,MAAM,CAAC,CAAC,CAACiF,IAAI,CAAEY,KAAK,IAAK;MAC5B,MAAMiC,OAAO,GAAGjC,KAAK,CAClBkC,MAAM,CAAE3F,IAAI,IAAK;QAChB,IAAI4F,KAAK,GAAGJ,KAAK,CAACK,IAAI,CAAC7F,IAAI,CAACO,KAAK,CAAC;QAClC,IAAIgF,YAAY,EAAE;UAChBK,KAAK,KAAKJ,KAAK,CAACK,IAAI,CAAC7F,IAAI,CAAC9J,OAAO,CAAC;QACpC;QACA,OAAO0P,KAAK;MACd,CAAC,CAAC,CACDxG,GAAG,CAAEY,IAAI,IAAKA,IAAI,CAACvK,EAAE,CAAC;MACzB,IAAI,CAACuF,OAAO,CAAC8G,gBAAgB,CAAC,iBAAiB,CAAC,CAACG,OAAO,CAAEC,IAAI,IAAK;QACjE,IAAIwD,OAAO,CAACI,QAAQ,CAAC5D,IAAI,CAACzH,IAAI,CAAChF,EAAE,CAAC,EAAE;UAClC;UACAyM,IAAI,CAACtK,SAAS,CAACK,MAAM,CAAC,QAAQ,CAAC;QACjC,CAAC,MAAM;UACLiK,IAAI,CAACtK,SAAS,CAACC,GAAG,CAAC,QAAQ,CAAC;QAC9B;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA8M,MAAMA,CAAA,EAAG;IACP,IAAI,CAAC3J,OAAO,CAACpD,SAAS,CAAC+M,MAAM,CAAC,WAAW,CAAC;IAC1C,IAAI,CAACR,eAAe,CAACvM,SAAS,CAAC+M,MAAM,CAAC,WAAW,CAAC;IAClD,IAAI,IAAI,CAAC3J,OAAO,CAACpD,SAAS,CAACmO,QAAQ,CAAC,WAAW,CAAC,EAAE;MAChD,IAAI,CAAC/B,QAAQ,CAAC5L,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC;IAC9C,CAAC,MAAM;MACL,IAAI,CAAC4L,QAAQ,CAAC5L,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC;IAC/C;EACF;EAEA,MAAMqM,aAAaA,CAAA,EAAG;IACpB,MAAMrE,4BAAa,CAACE,UAAU,CAAC,CAAC;EAClC;EAEA,MAAMoE,WAAWA,CAAA,EAAG;IAClB,MAAMtE,4BAAa,CAACS,UAAU,CAAC,CAAC;EAClC;AACF;AAAC3I,OAAA,CAAA6L,OAAA,GAAAA,OAAA;;;;;;;;AC/GM,MAAMiC,UAAU,CAAC;EACtB1Q,WAAWA,CAAA,EAAG;IACZQ,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAE,UAAUC,KAAK,EAAE;MAClD;MACA,IAAIA,KAAK,CAACsG,MAAM,CAAChF,SAAS,CAACmO,QAAQ,CAAC,aAAa,CAAC,EAAE;QAClD,MAAME,cAAc,GAAG3P,KAAK,CAACsG,MAAM,CAACsJ,YAAY,CAAC,aAAa,CAAC;QAC/D,MAAMC,UAAU,GAAGrQ,QAAQ,CAACG,cAAc,CAACgQ,cAAc,CAAC,CAACG,SAAS;QACpE;QACA,MAAMC,QAAQ,GAAGvQ,QAAQ,CAACwQ,aAAa,CAAC,UAAU,CAAC;QACnDD,QAAQ,CAAChO,KAAK,GAAG8N,UAAU;QAC3BrQ,QAAQ,CAACC,IAAI,CAACiC,WAAW,CAACqO,QAAQ,CAAC;;QAEnC;QACAA,QAAQ,CAACE,MAAM,CAAC,CAAC;QACjBzQ,QAAQ,CAAC0Q,WAAW,CAAC,MAAM,CAAC;;QAE5B;QACA1Q,QAAQ,CAACC,IAAI,CAAC0Q,WAAW,CAACJ,QAAQ,CAAC;;QAEnC;QACAK,KAAK,CAAC,0BAA0B,CAAC;MACnC;IACF,CAAC,CAAC;EACJ;AACF;AAACxO,OAAA,CAAA8N,UAAA,GAAAA,UAAA;;;;;;;;ACxBM,MAAMW,SAAS,CAAC;EACrBrR,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACsR,eAAe,GAAG,IAAI;EAC7B;EAEA,MAAMC,IAAIA,CAACvN,GAAG,EAAEmB,IAAI,EAAEqM,UAAU,EAAEC,OAAO,EAAEC,MAAM,EAAE;IACjD,MAAMxK,OAAO,GAAG;MAAE/B;IAAK,CAAC;IACxB,IAAI;MACF,MAAMwM,QAAQ,GAAG,MAAM,IAAI,CAACC,eAAe,CAAC5N,GAAG,EAAEmB,IAAI,CAAC;MACtD,MAAM,IAAI,CAAC0M,cAAc,CAAC3K,OAAO,EAAEyK,QAAQ,EAAEH,UAAU,EAAEE,MAAM,CAAC;IAClE,CAAC,CAAC,OAAOlQ,KAAK,EAAE;MACdiQ,OAAO,CAACvK,OAAO,EAAE1F,KAAK,CAAC;IACzB;EACF;EAEA,MAAMoQ,eAAeA,CAAC5N,GAAG,EAAEmB,IAAI,EAAE;IAC/B,IAAI,CAACmM,eAAe,GAAG,IAAIQ,eAAe,CAAC,CAAC;IAC5C,MAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACT,eAAe;IACvC,MAAMK,QAAQ,GAAG,MAAMK,KAAK,CAAChO,GAAG,EAAE;MAChC+N,MAAM;MACNE,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QAAE,cAAc,EAAE;MAAmB,CAAC;MAC/CzR,IAAI,EAAEL,IAAI,CAACC,SAAS,CAAC8E,IAAI;IAC3B,CAAC,CAAC;IAEF,IAAI,CAACwM,QAAQ,CAACQ,EAAE,EAAE;MAChB,MAAM,IAAIrL,KAAK,CAAE,GAAE9C,GAAI,uBAAsB2N,QAAQ,CAACS,MAAO,EAAC,CAAC;IACjE;IAEA,OAAOT,QAAQ;EACjB;EAEA,MAAME,cAAcA,CAAC3K,OAAO,EAAEyK,QAAQ,EAAEH,UAAU,EAAEE,MAAM,EAAE;IAC1D,MAAMW,MAAM,GAAGV,QAAQ,CAAClR,IAAI,CAAC6R,SAAS,CAAC,CAAC;IACxC,IAAIC,WAAW,GAAG,EAAE;IACpB,IAAIC,aAAa,GAAG,KAAK;IAEzB,OAAO,CAACA,aAAa,EAAE;MACrB,MAAM;QAAEC,IAAI;QAAE1P;MAAM,CAAC,GAAG,MAAMsP,MAAM,CAACK,IAAI,CAAC,CAAC;MAC3C,IAAID,IAAI,EAAE;QACRf,MAAM,CAACxK,OAAO,EAAEyK,QAAQ,CAAC;QACzBa,aAAa,GAAG,IAAI;QACpB;MACF;MAEA,MAAMG,SAAS,GAAG,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAAC9P,KAAK,CAAC;MACjD,MAAM+P,KAAK,GAAG,CAACP,WAAW,GAAGI,SAAS,EAAEI,KAAK,CAAC,IAAI,CAAC;MACnDR,WAAW,GAAGO,KAAK,CAACE,GAAG,CAAC,CAAC;MAEzBF,KAAK,CAACnG,OAAO,CAAEsG,IAAI,IAAK;QACtB,MAAMC,YAAY,GAAG9S,IAAI,CAACoD,KAAK,CAACyP,IAAI,CAAC;QACrC,IAAIA,IAAI,CAACjD,IAAI,CAAC,CAAC,EAAE;UACf;UACA,IAAI,CAACmD,kBAAkB,CAACD,YAAY,CAAC;UACrC1B,UAAU,CAACtK,OAAO,EAAEgM,YAAY,CAACjT,OAAO,CAACW,OAAO,CAAC;QACnD;MACF,CAAC,CAAC;IACJ;IAEA,IAAI2R,WAAW,CAACvC,IAAI,CAAC,CAAC,EAAE;MACtBwB,UAAU,CAACtK,OAAO,EAAEqL,WAAW,CAAC;IAClC;EACF;EAEAa,KAAKA,CAAA,EAAG;IACN,IAAI,IAAI,CAAC9B,eAAe,EAAE;MACxB,IAAI,CAACA,eAAe,CAAC8B,KAAK,CAAC,CAAC;IAC9B;EACF;EAEAD,kBAAkBA,CAAChO,IAAI,EAAE;IACvB,IAAI,CAACA,IAAI,CAACkO,cAAc,EAAE;MACxB;IACF;IACA;IACA,MAAMC,sBAAsB,GAAGnO,IAAI,CAACkO,cAAc,GAAG,GAAG;IACxD,MAAME,qBAAqB,GAAGpO,IAAI,CAACqO,aAAa,GAAG,GAAG;IACtD,MAAMC,2BAA2B,GAAGtO,IAAI,CAACuO,oBAAoB,GAAG,GAAG;IACnE,MAAMC,6BAA6B,GAAGxO,IAAI,CAACyO,aAAa,GAAG,GAAG;;IAE9D;IACA,MAAMC,eAAe,GAAG1O,IAAI,CAAC2O,UAAU,GAAGH,6BAA6B;IACvE,MAAMI,MAAM,GAAI;AACpB,SAAS5O,IAAI,CAAChB,KAAM;AACpB,cAAcgB,IAAI,CAAC6O,UAAW;AAC9B,sBAAsBV,sBAAsB,CAACW,OAAO,CAAC,CAAC,CAAE;AACxD,qBAAqBV,qBAAqB,CAACU,OAAO,CAAC,CAAC,CAAE;AACtD,2BAA2B9O,IAAI,CAAC+O,iBAAkB;AAClD,kCAAkCT,2BAA2B,CAACQ,OAAO,CAAC,CAAC,CAAE;AACzE,6BAA6B9O,IAAI,CAAC2O,UAAW;AAC7C,oCAAoCH,6BAA6B,CAACM,OAAO,CAAC,CAAC,CAAE;AAC7E,qBAAqBJ,eAAe,CAACI,OAAO,CAAC,CAAC,CAAE;AAChD,KAAK;IACD1S,OAAO,CAAC6D,GAAG,CAAC2O,MAAM,CAAC;EACrB;EAEA,OAAOI,SAASA,CAACnQ,GAAG,EAAEwN,UAAU,EAAE;IAChC,IAAI,CAACxN,GAAG,EAAE;MACR,OAAO,IAAI;IACb;IAEA,OAAOgO,KAAK,CAAChO,GAAG,CAAC,CACduJ,IAAI,CAAEoE,QAAQ,IAAK;MAClB,IAAI,CAACA,QAAQ,CAACQ,EAAE,EAAE;QAChB,MAAM,IAAIrL,KAAK,CAAE,+BAA8B9C,GAAI,EAAC,CAAC;MACvD;MACA,OAAO2N,QAAQ,CAACyC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CACD7G,IAAI,CAAEpI,IAAI,IAAK;MACdqM,UAAU,CAACrM,IAAI,CAACkP,MAAM,CAAC;IACzB,CAAC,CAAC,CACDC,KAAK,CAAE9S,KAAK,IAAK;MAChBD,OAAO,CAACS,KAAK,CAACR,KAAK,CAAC;MACpBD,OAAO,CAACC,KAAK,CACV,2CAA0CwC,GAAI,qBACjD,CAAC;MACDwN,UAAU,CAAC,EAAE,CAAC;IAChB,CAAC,CAAC;EACN;AACF;AAAC5O,OAAA,CAAAyO,SAAA,GAAAA,SAAA;;;;;;;;ACvHM,MAAMkD,cAAc,CAAC;EAC1BvU,WAAWA,CAAA,EAAG;IACZQ,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAGC,KAAK,IAAK;MAC5C;MACA,IAAIA,KAAK,CAACsG,MAAM,CAAChF,SAAS,CAACmO,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QACtD;QACA,MAAM+D,QAAQ,GAAGxT,KAAK,CAACsG,MAAM,CAACsJ,YAAY,CAAC,aAAa,CAAC;QACzD,IAAI,CAAC6D,sBAAsB,CAACD,QAAQ,EAAE,WAAW,CAAC;MACpD;IACF,CAAC,CAAC;EACJ;EAEAC,sBAAsBA,CAACC,SAAS,EAAEC,QAAQ,EAAE;IAC1C;IACA,MAAMjP,OAAO,GAAGlF,QAAQ,CAACG,cAAc,CAAC+T,SAAS,CAAC;IAClD,IAAI,CAAChP,OAAO,EAAE;MACZnE,OAAO,CAACC,KAAK,CAAC,mBAAmB,CAAC;MAClC;IACF;;IAEA;IACA,MAAMZ,OAAO,GAAG8E,OAAO,CAACoL,SAAS;;IAEjC;IACA,MAAM8D,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACjU,OAAO,CAAC,EAAE;MAAEV,IAAI,EAAE;IAAY,CAAC,CAAC;;IAEvD;IACA,MAAM4U,CAAC,GAAGtU,QAAQ,CAACwQ,aAAa,CAAC,GAAG,CAAC;IACrC8D,CAAC,CAAChR,IAAI,GAAGD,GAAG,CAACkR,eAAe,CAACH,IAAI,CAAC;IAClCE,CAAC,CAACE,QAAQ,GAAGL,QAAQ;;IAErB;IACAnU,QAAQ,CAACC,IAAI,CAACiC,WAAW,CAACoS,CAAC,CAAC;IAC5BA,CAAC,CAACG,KAAK,CAAC,CAAC;IACTzU,QAAQ,CAACC,IAAI,CAAC0Q,WAAW,CAAC2D,CAAC,CAAC;;IAE5B;IACAjR,GAAG,CAACqR,eAAe,CAACJ,CAAC,CAAChR,IAAI,CAAC;EAC7B;AACF;AAAClB,OAAA,CAAA2R,cAAA,GAAAA,cAAA;;;;;;;;ACvCM,MAAMY,YAAY,CAAC;EACxBnV,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACoV,cAAc,GAAG,iBAAiB;IACvC,IAAI,CAACC,aAAa,GAAG7U,QAAQ,CAACgM,gBAAgB,CAAC,IAAI,CAAC4I,cAAc,CAAC;IACnE,IAAI,CAACE,IAAI,CAAC,CAAC;EACb;EAEAA,IAAIA,CAAA,EAAG;IACL;IACA9U,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAGC,KAAK,IAAK;MAC5C;MACA,MAAMuU,WAAW,GAAGvU,KAAK,CAACsG,MAAM,CAACkO,OAAO,CAAC,IAAI,CAACJ,cAAc,CAAC;MAC7D,IAAIG,WAAW,EAAE;QACf,MAAME,YAAY,GAAGF,WAAW,CAACnT,aAAa,CAAC,uBAAuB,CAAC;QACvE,IAAIqT,YAAY,EAAE;UAChB,IAAI,CAACC,UAAU,CAACD,YAAY,CAAC;QAC/B;MACF;IACF,CAAC,CAAC;EACJ;EAEAC,UAAUA,CAACC,IAAI,EAAE;IACfA,IAAI,CAACrT,SAAS,CAAC+M,MAAM,CAAC,QAAQ,CAAC;IAC/BsG,IAAI,CAACrT,SAAS,CAAC+M,MAAM,CAAC,SAAS,CAAC;EAClC;AACF;AAACzM,OAAA,CAAAuS,YAAA,GAAAA,YAAA;;;;;;;;ACzBD;AACO,MAAMS,KAAK,CAAC;EACjB5V,WAAWA,CAACM,KAAK,EAAE;IACjB,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACuV,KAAK,GAAGrV,QAAQ,CAACG,cAAc,CAAC,IAAI,CAACL,KAAK,CAAC;IAChD,IAAI,CAACkC,WAAW,GAAG,IAAI,CAACqT,KAAK,CAACzT,aAAa,CAAC,eAAe,CAAC;IAC5D,IAAI,CAACI,WAAW,CAACC,OAAO,GAAG,MAAM,IAAI,CAACvB,IAAI,CAAC,CAAC;IAC5C,IAAI,CAACL,mBAAmB,CAAC,CAAC;EAC5B;EAEAA,mBAAmBA,CAAA,EAAG;IACpBC,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAGC,KAAK,IAAK;MAC5C,IAAIA,KAAK,CAACC,GAAG,KAAK,QAAQ,EAAE;QAC1B,IAAI,CAACC,IAAI,CAAC,CAAC;MACb;IACF,CAAC,CAAC;EACJ;EAEAC,IAAIA,CAAA,EAAG;IACL,IAAI,CAAC2U,UAAU,CAAC,CAAC;EACnB;EAEA5U,IAAIA,CAAA,EAAG;IACL,IAAI,CAAC6U,UAAU,CAAC,CAAC;EACnB;EAEAD,UAAUA,CAAA,EAAG;IACX,IAAI,CAACD,KAAK,CAACvT,SAAS,CAACC,GAAG,CAAC,MAAM,CAAC;EAClC;EAEAwT,UAAUA,CAAA,EAAG;IACX,IAAI,CAACF,KAAK,CAACvT,SAAS,CAACK,MAAM,CAAC,MAAM,CAAC;EACrC;AACF;AAACC,OAAA,CAAAgT,KAAA,GAAAA,KAAA;;;;;;;;ACjCM,MAAMI,IAAI,CAAC;EAChBhW,WAAWA,CAACiW,WAAW,EAAEC,KAAK,EAAEvK,QAAQ,EAAE;IACxC,IAAI,CAACpL,SAAS,GAAGC,QAAQ,CAACG,cAAc,CAACsV,WAAW,CAAC;IACrD,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACvK,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACG,MAAM,CAAC,CAAC;IACb,IAAI,CAACqK,YAAY,GAAG,IAAI;EAC1B;EAEAjK,OAAOA,CAAClH,OAAO,EAAE;IACf,IAAI,CAACmR,YAAY,GAAGnR,OAAO;IAC3B,OAAO,IAAI,CAAC,CAAC;EACf;EAEAoR,QAAQA,CAACF,KAAK,EAAE;IACd,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACpK,MAAM,CAAC,CAAC;EACf;EAEAuK,WAAWA,CAAC1K,QAAQ,EAAE;IACpBpK,OAAO,CAACS,KAAK,CAAE,UAAS2J,QAAS,EAAC,CAAC;IACnC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACG,MAAM,CAAC,CAAC;EACf;EAEAwK,WAAWA,CAAA,EAAG;IACZ,OAAO,IAAI,CAAC3K,QAAQ;EACtB;EAEAG,MAAMA,CAAA,EAAG;IACP,IAAI,CAACvL,SAAS,CAAC4M,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/B,MAAMoJ,EAAE,GAAG/V,QAAQ,CAACwQ,aAAa,CAAC,IAAI,CAAC;IACvCuF,EAAE,CAACjU,SAAS,CAACC,GAAG,CAAC,MAAM,CAAC;IACxB,IAAI,CAAC2T,KAAK,CAACvJ,OAAO,CAAEC,IAAI,IAAK;MAC3B,MAAM4J,EAAE,GAAGhW,QAAQ,CAACwQ,aAAa,CAAC,IAAI,CAAC;MACvCwF,EAAE,CAAClU,SAAS,CAACC,GAAG,CAAC,WAAW,CAAC;MAC7B,IAAIqK,IAAI,KAAK,IAAI,CAACjB,QAAQ,EAAE;QAC1B6K,EAAE,CAAClU,SAAS,CAACC,GAAG,CAAC,UAAU,CAAC;MAC9B;MACAiU,EAAE,CAACnU,WAAW,GAAGuK,IAAI;MACrB4J,EAAE,CAAC5J,IAAI,GAAGA,IAAI;MACd4J,EAAE,CAACzV,gBAAgB,CAAC,OAAO,EAAE,MAAM;QACjC,IAAI,CAACsV,WAAW,CAACzJ,IAAI,CAAC;QACtB,IAAI,IAAI,CAACuJ,YAAY,EAAE;UACrB,IAAI,CAACA,YAAY,CAACvJ,IAAI,CAAC;QACzB;MACF,CAAC,CAAC;MACF2J,EAAE,CAAC7T,WAAW,CAAC8T,EAAE,CAAC;IACpB,CAAC,CAAC;IACF,IAAI,CAACjW,SAAS,CAACmC,WAAW,CAAC6T,EAAE,CAAC;EAChC;AACF;AAAC3T,OAAA,CAAAoT,IAAA,GAAAA,IAAA;;;;;;;;ACnDD,IAAArL,MAAA,GAAAtB,OAAA;AACA,IAAAwB,SAAA,GAAAxB,OAAA;AACA,IAAAoN,UAAA,GAAApN,OAAA;AAEO,MAAMqN,MAAM,CAAC;EAClB,OAAOrC,MAAM,GAAG,EAAE;EAElB,OAAO3Q,MAAMA,CAAA,EAAG;IACd,OAAOb,kBAAQ,CAACa,MAAM,CAAC,WAAW,CAAC;EACrC;EAEA,OAAOiT,IAAIA,CAAA,EAAG;IACZ,IAAI,CAAC,IAAI,CAACjT,MAAM,CAAC,CAAC,EAAE;MAClB,OAAO,IAAI;IACb;IACA,OAAO2N,oBAAS,CAAC8C,SAAS,CAAC,IAAI,CAACzQ,MAAM,CAAC,CAAC,EAAG2Q,MAAM,IAAK;MACpDqC,MAAM,CAACrC,MAAM,GAAGA,MAAM;MACtBxR,kBAAQ,CAACC,GAAG,CAAC,QAAQ,EAAE4T,MAAM,CAACrC,MAAM,CAAC;MACrCxP,YAAK,CAACK,IAAI,CAAC,cAAc,EAAEwR,MAAM,CAACrC,MAAM,CAAC;IAC3C,CAAC,CAAC;EACJ;EAEA,OAAO/L,MAAMA,CAAA,EAAG;IACd,OAAOoO,MAAM,CAACrC,MAAM;EACtB;EAEA,OAAOuC,QAAQA,CAAA,EAAG;IAChB,OAAOF,MAAM,CAACrC,MAAM,CAACvK,GAAG,CAAE3F,KAAK,IAAKA,KAAK,CAACuF,IAAI,CAAC;EACjD;EAEA,OAAOmN,eAAeA,CAACnN,IAAI,EAAE;IAC3B,OAAOgN,MAAM,CAACrC,MAAM,CAACyC,IAAI,CAAE3S,KAAK,IAAKA,KAAK,CAACuF,IAAI,KAAKA,IAAI,CAAC;EAC3D;AACF;AAAC9G,OAAA,CAAA8T,MAAA,GAAAA,MAAA;;;;;;;;ACjCD,IAAAK,KAAA,GAAA1N,OAAA;AACA,IAAAsB,MAAA,GAAAtB,OAAA;AACA,IAAA2N,OAAA,GAAA3N,OAAA;AAEO,MAAM4N,UAAU,CAAC;EACtBjX,WAAWA,CAACsM,QAAQ,EAAE4K,aAAa,EAAE;IACnC,IAAI,CAACC,SAAS,GAAG,IAAInB,UAAI,CAAC1J,QAAQ,EAAEoK,cAAM,CAACE,QAAQ,CAAC,CAAC,EAAEM,aAAa,CAAC;IACrE,IAAI,CAACrL,kBAAkB,CAAC,CAAC;EAC3B;EAEAA,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAACsS,kBAAkB,CAACpL,IAAI,CAAC,IAAI,CAAC,CAAC;EAClE;EAEAoL,kBAAkBA,CAAA,EAAG;IACnB,IAAI,CAACD,SAAS,CAACf,QAAQ,CAACM,cAAM,CAACE,QAAQ,CAAC,CAAC,CAAC;EAC5C;EAEA1K,OAAOA,CAAClH,OAAO,EAAE;IACf,IAAI,CAACmS,SAAS,CAAChB,YAAY,GAAGnR,OAAO;IACrC,OAAO,IAAI,CAACmS,SAAS,CAAC,CAAC;EACzB;EAEAb,WAAWA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACa,SAAS,CAACxL,QAAQ;EAChC;AACF;AAAC/I,OAAA,CAAAqU,UAAA,GAAAA,UAAA;;;;;;;;AC1BD,IAAAI,MAAA,GAAAhO,OAAA;AACA,IAAAiO,eAAA,GAAAjO,OAAA;AACA,IAAAkO,WAAA,GAAAlO,OAAA;AACA,IAAA2N,OAAA,GAAA3N,OAAA;AACA,IAAAwB,SAAA,GAAAxB,OAAA;AAEO,MAAMmO,cAAc,SAAS5B,YAAK,CAAC;EACxC5V,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,iBAAiB,CAAC;IACxB,IAAI,CAACyX,UAAU,GAAGjX,QAAQ,CAACG,cAAc,CAAC,iBAAiB,CAAC;IAC5D,IAAI,CAAC+W,QAAQ,GAAGlX,QAAQ,CAACG,cAAc,CAAC,WAAW,CAAC;IACpD,IAAI,CAACgX,UAAU,GAAGnX,QAAQ,CAACG,cAAc,CAAC,aAAa,CAAC;IACxD,IAAI,CAACiX,iBAAiB,GAAG,IAAI,CAAC/B,KAAK,CAACzT,aAAa,CAAC,sBAAsB,CAAC;IACzE,IAAI,CAACyV,oBAAoB,GAAG,IAAI,CAAChC,KAAK,CAACzT,aAAa,CAClD,yBACF,CAAC;IACD,IAAI,CAAC0V,mBAAmB,GAAG,IAAI,CAACjC,KAAK,CAACzT,aAAa,CACjD,wBACF,CAAC;IACD,IAAI,CAAC+U,SAAS,GAAG,IAAIF,sBAAU,CAAC,YAAY,EAAEpU,kBAAQ,CAACoB,QAAQ,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC4H,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAACkM,YAAY,CAAC,CAAC;EACrB;EAEAlM,kBAAkBA,CAAA,EAAG;IACnB,IAAI,CAAC6L,QAAQ,CAAC3W,gBAAgB,CAAC,MAAM,EAAE,MAAM;MAC3C,MAAMgC,KAAK,GAAG,IAAI,CAAC2U,QAAQ,CAAC3U,KAAK,CAACiN,IAAI,CAAC,CAAC;MACxCnN,kBAAQ,CAACkB,MAAM,CAAChB,KAAK,CAAC;IACxB,CAAC,CAAC;IACF,IAAI,CAAC6U,iBAAiB,CAAC7W,gBAAgB,CAAC,MAAM,EAAE,MAAM;MACpD8B,kBAAQ,CAACwB,eAAe,CAAC,IAAI,CAACuT,iBAAiB,CAAC7U,KAAK,CAACiN,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IACF,IAAI,CAAC6H,oBAAoB,CAAC9W,gBAAgB,CAAC,MAAM,EAAE,MAAM;MACvD,MAAMgC,KAAK,GAAG,IAAI,CAAC8U,oBAAoB,CAAC9U,KAAK,CAACiN,IAAI,CAAC,CAAC;MACpD,IAAIjN,KAAK,KAAK,EAAE,EAAE;QAChB;MACF;MACA,IAAI;QACF,MAAMiV,WAAW,GAAG5X,IAAI,CAACoD,KAAK,CAACT,KAAK,CAAC;QACrC,MAAMkV,UAAU,GAAG7X,IAAI,CAACC,SAAS,CAAC2X,WAAW,EAAE,CAAC,CAAC;QACjDnV,kBAAQ,CAAC2B,kBAAkB,CAACwT,WAAW,CAAC;QACxC,IAAI,CAACH,oBAAoB,CAAC9U,KAAK,GAAGkV,UAAU;QAC5C,IAAI,CAACJ,oBAAoB,CAACvV,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;MACrD,CAAC,CAAC,OAAOnB,KAAK,EAAE;QACd,IAAIA,KAAK,CAACkI,IAAI,KAAK,aAAa,EAAE;UAChC,IAAI,CAACmO,oBAAoB,CAACvV,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;QAClD,CAAC,MAAM;UACLhB,OAAO,CAACC,KAAK,CAACA,KAAK,CAAC;QACtB;MACF;IACF,CAAC,CAAC;IACF,IAAI,CAAC2V,SAAS,CAACjL,OAAO,CAAC,MAAM;MAC3BrJ,kBAAQ,CAACqB,QAAQ,CAAC,IAAI,CAACiT,SAAS,CAACb,WAAW,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;IACF,IAAI,CAACmB,UAAU,CAAC1W,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACI,IAAI,CAAC6K,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,CAAC8L,mBAAmB,CAACrV,OAAO,GAAG,MAAM,IAAI,CAACyV,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC1V,WAAW,CAACC,OAAO,GAAG,MAAM,IAAI,CAACvB,IAAI,CAAC,CAAC;EAC9C;EAEAC,IAAIA,CAAA,EAAG;IACLuV,cAAM,CAACC,IAAI,CAAC,CAAC;IACb,IAAI,CAACb,UAAU,CAAC,CAAC;EACnB;EAEAoC,aAAaA,CAAA,EAAG;IACd,IAAI,CAACxB,cAAM,CAAChT,MAAM,CAAC,CAAC,EAAE;MACpB3D,8BAAc,CAACoB,IAAI,CAAC,oDAAoD,CAAC;IAC3E,CAAC,MAAM;MACLuV,cAAM,CAACC,IAAI,CAAC,CAAC;IACf;EACF;EAEAoB,YAAYA,CAAA,EAAG;IACb,IAAI,CAACL,QAAQ,CAAC3U,KAAK,GAAGF,kBAAQ,CAACa,MAAM,CAAC,CAAC;IACvC,MAAMe,eAAe,GAAG5B,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;IACrD,IAAIE,eAAe,EAAE;MACnB,IAAI,CAACoT,oBAAoB,CAAC9U,KAAK,GAAG3C,IAAI,CAACC,SAAS,CAACoE,eAAe,EAAE,CAAC,CAAC;IACtE;EACF;AACF;AAAC7B,OAAA,CAAA4U,cAAA,GAAAA,cAAA;;;;;;;;AC/ED,IAAAhM,cAAA,GAAAnC,OAAA;AACA,IAAAsB,MAAA,GAAAtB,OAAA;AACA,IAAAgO,MAAA,GAAAhO,OAAA;AACA,IAAA2N,OAAA,GAAA3N,OAAA;AACA,IAAAkO,WAAA,GAAAlO,OAAA;AAEO,MAAM8O,kBAAkB,SAASvC,YAAK,CAAC;EAC5C5V,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,sBAAsB,CAAC;IAC7B,IAAI,CAACyX,UAAU,GAAGjX,QAAQ,CAACG,cAAc,CAAC,sBAAsB,CAAC;IACjE,IAAI,CAACkL,kBAAkB,CAAC,CAAC;EAC3B;EAEAA,kBAAkBA,CAAA,EAAG;IACnB,IAAI,CAAC4L,UAAU,CAAC1W,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACI,IAAI,CAAC6K,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/DnH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;EAClE;EAEA7K,IAAIA,CAAA,EAAG;IACLuV,cAAM,CAACC,IAAI,CAAC,CAAC,CAACpJ,IAAI,CAAC,MAAM;MACvBzC,4BAAa,CAACO,cAAc,CAAC,CAAC,CAACkC,IAAI,CAAE7C,IAAI,IAAK;QAC5C,IAAI,CAACkD,kBAAkB,CAAClD,IAAI,CAAC;QAC7B,IAAI,CAACoL,UAAU,CAAC,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEAlI,kBAAkBA,CAAClD,IAAI,EAAE;IACvB,IAAI,CAACyM,SAAS,GAAG,IAAIF,sBAAU,CAAC,iBAAiB,EAAEvM,IAAI,CAACvG,KAAK,CAAC;IAC9D,IAAI,CAACgT,SAAS,CAACjL,OAAO,CAAC,MAAO/H,KAAK,IAAK;MACtCuG,IAAI,CAACvG,KAAK,GAAGA,KAAK;MAClB,MAAMuG,IAAI,CAACd,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;EACJ;AACF;AAAChH,OAAA,CAAAuV,kBAAA,GAAAA,kBAAA;;;;;;;;AClCM,MAAMC,SAAS,CAAC;EACrBpY,WAAWA,CAAC0F,OAAO,EAAE;IACnB,IAAI,CAACA,OAAO,GAAGA,OAAO;IACtBA,OAAO,CAAC2S,SAAS,GAAG,IAAI;IACxB,IAAI,CAACxM,kBAAkB,CAAC,CAAC;EAC3B;EAEAA,kBAAkBA,CAAA,EAAG;IACnB,IAAI,CAACnG,OAAO,CAAC3E,gBAAgB,CAAC,WAAW,EAAE,MAAM,IAAI,CAACgL,WAAW,CAAC,CAAC,CAAC;IACpE,IAAI,CAACrG,OAAO,CAAC3E,gBAAgB,CAAC,UAAU,EAAE,MAAM,IAAI,CAACkL,UAAU,CAAC,CAAC,CAAC;EACpE;EAEAF,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACrG,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;EACrC;EAEA0J,UAAUA,CAAA,EAAG;IACX,IAAI,CAACvG,OAAO,CAACpD,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;EACxC;AACF;AAACC,OAAA,CAAAwV,SAAA,GAAAA,SAAA;;;;;;;;ACnBD,IAAAzN,MAAA,GAAAtB,OAAA;AACA,IAAAmC,cAAA,GAAAnC,OAAA;AAEO,MAAMiP,SAAS,CAAC;EACrBtY,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACuY,YAAY,GAAG,UAAU;IAC9B,IAAI,CAAC7S,OAAO,GAAGlF,QAAQ,CAACG,cAAc,CAAC,YAAY,CAAC;IACpD,IAAI,CAACkL,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAACC,MAAM,CAAC,CAAC;EACf;EAEAA,MAAMA,CAAA,EAAG;IACPhB,4BAAa,CAACO,cAAc,CAAC,CAAC,CAACkC,IAAI,CAAE7C,IAAI,IAAK;MAC5C,IAAI,CAACA,IAAI,GAAGA,IAAI;MAChB,IAAI,CAACkB,QAAQ,CAAClB,IAAI,EAAEO,KAAK,CAAC;IAC5B,CAAC,CAAC;EACJ;EAEAW,QAAQA,CAACX,KAAK,EAAE;IACd,IAAI,CAACvF,OAAO,CAACrD,WAAW,GAAG4I,KAAK,IAAI,IAAI,CAACsN,YAAY;EACvD;EAEA5I,KAAKA,CAAA,EAAG;IACN,MAAM6I,QAAQ,GAAGhY,QAAQ,CAACiY,aAAa,KAAK,IAAI,CAAC/S,OAAO;IACxD,IAAI,CAAC8S,QAAQ,EAAE;MACb,IAAI,CAAC9S,OAAO,CAACiK,KAAK,CAAC,CAAC;IACtB;EACF;EAEA9D,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC2I,iBAAiB,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9DnH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAACtG,OAAO,CAAC3E,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC2X,UAAU,CAAC1M,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAACtG,OAAO,CAAC3E,gBAAgB,CAAC,UAAU,EAAGoC,CAAC,IAAK;MAC/C,IAAIA,CAAC,CAAClC,GAAG,KAAK,OAAO,EAAE;QACrBkC,CAAC,CAAC8J,cAAc,CAAC,CAAC;QAClB,IAAI,CAACvH,OAAO,CAACiT,IAAI,CAAC,CAAC;MACrB;IACF,CAAC,CAAC;EACJ;EAEA/K,kBAAkBA,CAAClD,IAAI,EAAE;IACvB,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACkB,QAAQ,CAAClB,IAAI,CAACO,KAAK,CAAC;EAC3B;EAEAwC,iBAAiBA,CAAC/C,IAAI,EAAE;IACtB,IAAIA,IAAI,CAACvK,EAAE,KAAK,IAAI,CAACuK,IAAI,CAACvK,EAAE,EAAE;MAC5B,IAAI,CAACyL,QAAQ,CAAC,IAAI,CAAC2M,YAAY,CAAC;IAClC;EACF;EAEA,MAAMG,UAAUA,CAAA,EAAG;IACjB,IAAIzN,KAAK,GAAG,IAAI,CAACvF,OAAO,CAACrD,WAAW,CAAC2N,IAAI,CAAC,CAAC;IAC3C,IAAI/E,KAAK,CAACrL,MAAM,KAAK,CAAC,EAAE;MACtBqL,KAAK,GAAG,IAAI,CAACsN,YAAY;MACzB,IAAI,CAAC7S,OAAO,CAACpD,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;IACrC,CAAC,MAAM;MACL,IAAI,CAACmD,OAAO,CAACpD,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;IACxC;IACA,MAAM+H,IAAI,GAAG,MAAMI,4BAAa,CAACO,cAAc,CAAC,CAAC;IACjD,IAAIX,IAAI,EAAE;MACR,MAAMI,4BAAa,CAACC,UAAU,CAACL,IAAI,EAAE;QAAEO;MAAM,CAAC,CAAC;IACjD,CAAC,MAAM;MACL,MAAMH,4BAAa,CAACE,UAAU,CAAC;QAAEC;MAAM,CAAC,CAAC;IAC3C;EACF;AACF;AAACrI,OAAA,CAAA0V,SAAA,GAAAA,SAAA;;;;;;;;ACnED;AACO,MAAMM,QAAQ,CAAC;EACpB5Y,WAAWA,CAAA,EAAG;IACZ,IAAI,CAAC6Y,WAAW,GAAGrY,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;IAC1D,IAAI,CAACmY,YAAY,GAAGtY,QAAQ,CAACG,cAAc,CAAC,eAAe,CAAC;IAC5D,IAAI,CAACoY,UAAU,GAAGvY,QAAQ,CAACG,cAAc,CAAC,aAAa,CAAC;IACxD,IAAI,CAACqY,WAAW,GAAGxY,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;EAC5D;AACF;AAACiC,OAAA,CAAAgW,QAAA,GAAAA,QAAA;;;;;;;;ACRD,IAAApN,cAAA,GAAAnC,OAAA;AACA,IAAAsB,MAAA,GAAAtB,OAAA;AACA,IAAA4P,UAAA,GAAA5P,OAAA;AACA,IAAA6P,UAAA,GAAA7P,OAAA;AACA,IAAA8P,SAAA,GAAA9P,OAAA;AAEO,MAAM+P,QAAQ,CAAC;EACpBpZ,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACoM,SAAS,GAAG,IAAIkM,oBAAS,CAAC,CAAC;IAChC,IAAI,CAACe,QAAQ,GAAG,IAAIT,kBAAQ,CAAC,CAAC;IAC9B,IAAI,CAACC,WAAW,GAAGrY,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;IAC1D,IAAI,CAACmY,YAAY,GAAGtY,QAAQ,CAACG,cAAc,CAAC,eAAe,CAAC;IAC5D,IAAI,CAAC2Y,cAAc,GAAG9Y,QAAQ,CAACG,cAAc,CAAC,kBAAkB,CAAC;IACjE,IAAI,CAAC4Y,iBAAiB,GAAG/Y,QAAQ,CAACG,cAAc,CAAC,sBAAsB,CAAC;IACxE,IAAI,CAAC6Y,iBAAiB,GAAGhZ,QAAQ,CAACG,cAAc,CAAC,sBAAsB,CAAC;IACxE,IAAI,CAAC8Y,gBAAgB,GAAGjZ,QAAQ,CAACG,cAAc,CAAC,oBAAoB,CAAC;IACrEmK,4BAAa,CAACO,cAAc,CAAC,CAAC,CAACkC,IAAI,CAAE7C,IAAI,IAAK;MAC5C,IAAI,CAACA,IAAI,GAAGA,IAAI;MAChB,IAAI,CAACoB,MAAM,CAAC,CAAC;IACf,CAAC,CAAC;IACF,IAAI,CAACD,kBAAkB,CAAC,CAAC;EAC3B;EAEAC,MAAMA,CAAA,EAAG;IACP;IACA,IAAI,CAAC+M,WAAW,CAAC/H,SAAS,GAAG,EAAE;IAC/B;IACA,IAAI,CAACpG,IAAI,EAAED,WAAW,CAAC,CAAC,EAAE8C,IAAI,CAAErD,QAAQ,IAAK;MAC3CA,QAAQ,CAACyC,OAAO,CAAE1M,OAAO,IAAK;QAC5B,IAAI,CAACyZ,gBAAgB,CAACzZ,OAAO,CAAC;MAChC,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,IAAI,CAAC0Z,WAAW,CAAC,CAAC;IAClB,IAAI,CAACb,YAAY,CAACnJ,KAAK,CAAC,CAAC;EAC3B;EAEA9D,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChEnH,YAAK,CAACC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC2I,iBAAiB,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CAACuN,iBAAiB,CAACxY,gBAAgB,CACrC,OAAO,EACP,IAAI,CAAC6Y,WAAW,CAAC5N,IAAI,CAAC,IAAI,CAC5B,CAAC;IACD,IAAI,CAACwN,iBAAiB,CAACzY,gBAAgB,CACrC,OAAO,EACP,IAAI,CAAC4Y,WAAW,CAAC3N,IAAI,CAAC,IAAI,CAC5B,CAAC;IACD,IAAI,CAACsN,cAAc,CAACvY,gBAAgB,CAClC,OAAO,EACP,IAAI,CAAC8Y,cAAc,CAAC7N,IAAI,CAAC,IAAI,CAC/B,CAAC;IACD,IAAI,CAACyN,gBAAgB,CAAC1Y,gBAAgB,CACpC,OAAO,EACP,IAAI,CAAC+Y,gBAAgB,CAAC9N,IAAI,CAAC,IAAI,CACjC,CAAC;IACD,IAAI,CAAC+N,cAAc,GAAG,IAAI,CAAClB,WAAW,CAACzW,aAAa,CAAC,WAAW,CAAC;IACjE;IACA5B,QAAQ,CAACO,gBAAgB,CAAC,SAAS,EAAGC,KAAK,IAAK;MAC9C,IAAIgZ,IAAI,EAAEC,QAAQ;MAElB,IAAIjZ,KAAK,CAACC,GAAG,KAAK,WAAW,EAAE;QAC7B+Y,IAAI,GAAG,IAAI,CAACD,cAAc,GAAG,IAAI,CAACA,cAAc,CAACG,kBAAkB,GAAG,IAAI,CAACrB,WAAW,CAACsB,iBAAiB;QACxG,IAAIH,IAAI,EAAE;UACR,IAAI,IAAI,CAACD,cAAc,EAAE,IAAI,CAACA,cAAc,CAACzX,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;UACtEqX,IAAI,CAAC1X,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;UAC3B,IAAI,CAACwX,cAAc,GAAGC,IAAI,CAAC,CAAC;UAC5B,IAAI,CAACD,cAAc,CAACxK,cAAc,CAAC;YAAEC,QAAQ,EAAE,QAAQ;YAAEC,KAAK,EAAE;UAAU,CAAC,CAAC,CAAC,CAAC;QAChF;MACF,CAAC,MAAM,IAAIzO,KAAK,CAACC,GAAG,KAAK,SAAS,EAAE;QAClCgZ,QAAQ,GAAG,IAAI,CAACF,cAAc,GAAG,IAAI,CAACA,cAAc,CAACK,sBAAsB,GAAG,IAAI,CAACvB,WAAW,CAACwB,gBAAgB;QAC/G,IAAIJ,QAAQ,EAAE;UACZ,IAAI,IAAI,CAACF,cAAc,EAAE,IAAI,CAACA,cAAc,CAACzX,SAAS,CAACK,MAAM,CAAC,OAAO,CAAC;UACtEsX,QAAQ,CAAC3X,SAAS,CAACC,GAAG,CAAC,OAAO,CAAC;QACjC;QACA,IAAI,CAACwX,cAAc,GAAGE,QAAQ,CAAC,CAAC;QAChC,IAAI,CAACF,cAAc,CAACxK,cAAc,CAAC;UAAEC,QAAQ,EAAE,QAAQ;UAAEC,KAAK,EAAE;QAAU,CAAC,CAAC,CAAC,CAAC;MAChF;IACF,CAAC,CAAC;EACJ;EAEAiK,gBAAgBA,CAACzZ,OAAO,EAAE;IACxB,MAAMqa,IAAI,GAAGra,OAAO,CAACqa,IAAI;IACzB,MAAM1Z,OAAO,GAAGX,OAAO,CAACW,OAAO;IAC/B;IACA,MAAMF,QAAQ,GAAGF,QAAQ,CAACG,cAAc,CAAC,uBAAuB,CAAC;IACjE,MAAM4Z,YAAY,GAAG7Z,QAAQ,CAACE,OAAO,CAACsB,SAAS,CAAC,IAAI,CAAC;IACrD;IACA,MAAMsY,UAAU,GAAGD,YAAY,CAACnY,aAAa,CAAC,eAAe,CAAC;IAC9D,MAAMqY,QAAQ,GAAGF,YAAY,CAACnY,aAAa,CAAC,oBAAoB,CAAC;IACjE,MAAMsY,YAAY,GAAGH,YAAY,CAACnY,aAAa,CAC7C,6BACF,CAAC;;IAED;IACAoY,UAAU,CAAClY,SAAS,CAACC,GAAG,CAAE,GAAE+X,IAAK,eAAc,CAAC;IAChDG,QAAQ,CAACpY,WAAW,GAAGzB,OAAO;IAC9B4Z,UAAU,CAACG,UAAU,GAAG,KAAK;;IAE7B;IACA,IAAI,CAAC9B,WAAW,CAACnW,WAAW,CAAC8X,UAAU,CAAC;IACxCA,UAAU,CAACI,OAAO,CAAC,IAAI,CAAC,GAAG3a,OAAO,CAACE,EAAE;IACrC,IAAIiY,oBAAS,CAACoC,UAAU,CAAC;IACzBE,YAAY,CAAC3Z,gBAAgB,CAAC,OAAO,EAAE,YAAY;MACjD,MAAM+J,4BAAa,CAACI,iBAAiB,CAACjL,OAAO,CAACE,EAAE,CAAC;MACjDqa,UAAU,CAAC7X,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IACF,OAAO6X,UAAU;EACnB;EAEA/M,iBAAiBA,CAAC/C,IAAI,EAAE;IACtB,IAAIA,IAAI,CAACvK,EAAE,KAAK,IAAI,CAACuK,IAAI,EAAEvK,EAAE,EAAE;MAC7B,IAAI,CAACuK,IAAI,GAAG,IAAI;IAClB,CAAC,MAAM;MACL,IAAI,CAACA,IAAI,GAAGA,IAAI;IAClB;IACA,IAAI,CAACoB,MAAM,CAAC,CAAC;EACf;EAEA8B,kBAAkBA,CAAClD,IAAI,EAAE;IACvB,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACoB,MAAM,CAAC,CAAC;EACf;EAEA+N,cAAcA,CAAA,EAAG;IACf,IAAI,CAACzN,SAAS,CAACuD,KAAK,CAAC,CAAC;IACtB3O,KAAK,CAAC6Z,eAAe,CAAC,CAAC;EACzB;EAEA,MAAMf,gBAAgBA,CAAA,EAAG;IACvB,MAAMpP,IAAI,GAAG,MAAMI,4BAAa,CAACO,cAAc,CAAC,CAAC;IACjD,IAAIX,IAAI,EAAE;MACR,MAAMI,4BAAa,CAACM,UAAU,CAACV,IAAI,CAAC;IACtC;EACF;EAEAkP,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACf,WAAW,CAACiC,SAAS,GAAG,CAAC;EAChC;EAEAnB,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACd,WAAW,CAACiC,SAAS,GAAG,IAAI,CAACjC,WAAW,CAACkC,YAAY;EAC5D;AACF;AAACnY,OAAA,CAAAwW,QAAA,GAAAA,QAAA;;;;;;;;AC9ID,IAAA9B,eAAA,GAAAjO,OAAA;AACA,IAAAwB,SAAA,GAAAxB,OAAA;AACA,IAAAsB,MAAA,GAAAtB,OAAA;AACA,IAAA2R,IAAA,GAAA3R,OAAA;AACA,IAAA4R,QAAA,GAAA5R,OAAA;AACA,IAAAmC,cAAA,GAAAnC,OAAA;AACA,IAAA6R,WAAA,GAAA7R,OAAA;AACA,IAAAoN,UAAA,GAAApN,OAAA;AACA,IAAA8R,eAAA,GAAA9R,OAAA;AACA,IAAA+R,aAAA,GAAA/R,OAAA;AACA,IAAAgS,eAAA,GAAAhS,OAAA;AACA,IAAAiS,mBAAA,GAAAjS,OAAA;AAEA,IAAAkS,SAAA,GAAAlS,OAAA;AADA;;AAGA;AACO,MAAMmS,GAAG,CAAC;EACf,OAAOC,GAAGA,CAAA,EAAG;IACX1b,8BAAc,CAACsB,UAAU,CAAC,CAAC;IAC3B,MAAMqa,GAAG,GAAG,IAAIF,GAAG,CAAC,CAAC;IACrB,OAAOE,GAAG;EACZ;EAEA1b,WAAWA,CAAA,EAAG;IACZ,IAAI,CAAC2b,OAAO,GAAG,IAAIlN,gBAAO,CAAC,CAAC;IAC5B,IAAI,CAACmN,QAAQ,GAAG,IAAIxC,kBAAQ,CAAC,CAAC;IAC9B,IAAI,CAACyC,SAAS,GAAG,IAAIxK,oBAAS,CAAC,CAAC;IAChC,IAAI,CAACyK,cAAc,GAAG,IAAItE,8BAAc,CAAC,CAAC;IAC1C,IAAI,CAACuE,kBAAkB,GAAG,IAAI5D,sCAAkB,CAAC,CAAC;IAClD,IAAI,CAAC6D,cAAc,GAAG,IAAIzH,8BAAc,CAAC,CAAC;IAC1C,IAAI,CAAC0H,UAAU,GAAG,IAAIvL,sBAAU,CAAC,CAAC;IAClC,IAAI,CAAC+E,YAAY,GAAG,IAAIN,0BAAY,CAAC,CAAC;IACtC,IAAI,CAAC+G,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAACrQ,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAACsQ,iBAAiB,CAAC,CAAC;IACxB,IAAI,CAACrQ,MAAM,CAAC,CAAC;EACf;EAEAoQ,kBAAkBA,CAAA,EAAG;IACnB;IACA,IAAI,CAAClD,WAAW,GAAGxY,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;IAC1D,IAAI,CAACmY,YAAY,GAAGtY,QAAQ,CAACG,cAAc,CAAC,eAAe,CAAC;IAC5D,IAAI,CAACkY,WAAW,GAAGrY,QAAQ,CAACG,cAAc,CAAC,cAAc,CAAC;EAC5D;EAEAwb,iBAAiBA,CAAA,EAAG;IAClB,MAAMC,GAAG,GAAI;AACjB,eAAevZ,kBAAQ,CAACoB,QAAQ,CAAC,CAAE;AACnC,eAAepB,kBAAQ,CAACa,MAAM,CAAC,CAAE;AACjC,eAAeb,kBAAQ,CAAC6B,gBAAgB,CAAC,CAAE;AAC3C,eAAetE,IAAI,CAACC,SAAS,CAACwC,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC,CAAE;AAC7D,CAAC;IACGhD,OAAO,CAAC6D,GAAG,CAACgX,GAAG,CAAC;EAClB;EAEAtQ,MAAMA,CAAA,EAAG;IACP,IAAI,CAAC6P,OAAO,CAAC7P,MAAM,CAAC,CAAC;IACrB,IAAI,CAAC8P,QAAQ,CAAC9P,MAAM,CAAC,CAAC;EACxB;EAEAD,kBAAkBA,CAAA,EAAG;IACnBhH,YAAK,CAACC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC8I,kBAAkB,CAAC;IACrD;IACA,IAAI,CAACoL,WAAW,CAACjY,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACsb,WAAW,CAACrQ,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC8M,YAAY,CAAC/X,gBAAgB,CAChC,UAAU,EACV,IAAI,CAACub,cAAc,CAACtQ,IAAI,CAAC,IAAI,CAC/B,CAAC;EACH;EAEA4B,kBAAkB,GAAIlD,IAAI,IAAK;IAC7B5J,MAAM,CAACyb,OAAO,CAACC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAG,UAAS9R,IAAI,CAACvK,EAAG,EAAC,CAAC;EACvD,CAAC;EAEDkc,WAAW,GAAGA,CAAA,KAAM;IAClB,IAAI,CAACR,SAAS,CAACzI,KAAK,CAAC,CAAC;IACtB,IAAI,CAACqJ,UAAU,CAAC,CAAC;IACjBlb,OAAO,CAAC6D,GAAG,CAAC,iBAAiB,CAAC;EAChC,CAAC;EAEDkX,cAAc,GAAItb,KAAK,IAAK;IAC1B,IAAIA,KAAK,CAACC,GAAG,KAAK,OAAO,IAAI,CAACD,KAAK,CAAC0b,QAAQ,EAAE;MAC5C,IAAI,CAACC,WAAW,CAAC,CAAC;IACpB;EACF,CAAC;EAEDF,UAAUA,CAAA,EAAG;IACXjX,QAAG,CAACG,WAAW,CAAC,IAAI,CAACqT,WAAW,CAAC,CAC9BpT,WAAW,CAAC,IAAI,CAACkT,YAAY,CAAC;IACjC,IAAI,CAACA,YAAY,CAACnJ,KAAK,CAAC,CAAC;EAC3B;EAEAiN,WAAWA,CAAA,EAAG;IACZpX,QAAG,CAACC,WAAW,CAAC,IAAI,CAACuT,WAAW,CAAC,CAC9BlT,YAAY,CAAC,IAAI,CAACgT,YAAY,CAAC;EACpC;;EAEA;EACA,MAAM6D,WAAWA,CAAA,EAAG;IAClB,MAAME,WAAW,GAAG,IAAI,CAAC/D,YAAY,CAAC/V,KAAK,CAACiN,IAAI,CAAC,CAAC;IAClD;IACA,IAAItF,IAAI,GAAG,MAAMI,4BAAa,CAACO,cAAc,CAAC,CAAC;IAC/C,MAAMrH,GAAG,GAAGnB,kBAAQ,CAACa,MAAM,CAAC,WAAW,CAAC;IACxC,IAAI,CAACM,GAAG,EAAE;MACRjE,8BAAc,CAACoB,IAAI,CACjB,qDACF,CAAC;MACD,OAAO,IAAI;IACb;IACA,IAAI0b,WAAW,EAAE;MACf;MACA,IAAI,CAAC/D,YAAY,CAAC/V,KAAK,GAAG,EAAE;MAC5B;MACA,IAAI,CAAC2H,IAAI,EAAE;QACTA,IAAI,GAAG,MAAMI,4BAAa,CAACE,UAAU,CAAC;UACpCC,KAAK,EAAE,UAAU;UACjB9G,KAAK,EAAEtB,kBAAQ,CAACoB,QAAQ,CAAC;QAC3B,CAAC,CAAC;MACJ;MACA;MACA,MAAMyG,IAAI,CAACF,UAAU,CAAC;QACpB8P,IAAI,EAAE,MAAM;QACZ1Z,OAAO,EAAEic;MACX,CAAC,CAAC;MACF,MAAMvY,YAAY,GAAGzB,kBAAQ,CAACuB,eAAe,CAAC,CAAC;MAC/C,MAAMK,eAAe,GAAG5B,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;MACrD;MACA,IAAI,CAACqY,WAAW,CAAC,CAAC;MAClB;MACA,IAAI,CAACE,iBAAiB,CAAC;QAAElc,OAAO,EAAEic,WAAW;QAAEvC,IAAI,EAAE;MAAO,CAAC,CAAC;MAC9D;MACA,MAAMyC,eAAe,GAAG,IAAI,CAACD,iBAAiB,CAAC;QAC7Clc,OAAO,EAAE,EAAE;QACX0Z,IAAI,EAAE;MACR,CAAC,CAAC;MACF,MAAM0C,cAAc,GAAG;QACrBtS,IAAI;QACJ9J,OAAO,EAAE,EAAE;QAAE;QACbmc;MACF,CAAC;MACD,MAAME,WAAW,GAAG;QAClBC,MAAM,EAAEL,WAAW;QACnB1Y,KAAK,EAAEuG,IAAI,CAACvG,KAAK;QACjB+F,QAAQ,EAAE,CAAC,MAAMQ,IAAI,CAACD,WAAW,CAAC,CAAC,EAAEX,GAAG,CAAE7J,OAAO,KAAM;UACrDqa,IAAI,EAAEra,OAAO,CAACqa,IAAI;UAClB1Z,OAAO,EAAEX,OAAO,CAACW;QACnB,CAAC,CAAC;MACJ,CAAC;MACD;MACA,IAAI0D,YAAY,EAAE;QAChB2Y,WAAW,CAACE,MAAM,GAAG7Y,YAAY;MACnC;MACA;MACA,IAAIG,eAAe,EAAE;QACnBwY,WAAW,CAACG,OAAO,GAAG3Y,eAAe;MACvC;MACA;MACAsY,eAAe,CAAC5P,SAAS,GAAG,6BAA6B;MACzD;MACA,IAAI,CAAC0O,SAAS,CAACtK,IAAI,CACjBvN,GAAG,EACHiZ,WAAW,EACX,CAAC/V,OAAO,EAAEyK,QAAQ,KAChB,IAAI,CAACE,cAAc,CAAC3K,OAAO,EAAEyK,QAAQ,EAAEqL,cAAc,CAAC,EACxD,CAAC9V,OAAO,EAAE1F,KAAK,KAAK,IAAI,CAAC6b,mBAAmB,CAACnW,OAAO,EAAE1F,KAAK,CAAC,EAC5D,CAAC0F,OAAO,EAAEyK,QAAQ,KAChB,IAAI,CAAC2L,UAAU,CAACpW,OAAO,EAAEyK,QAAQ,EAAEqL,cAAc,CACrD,CAAC;IACH;EACF;EAEAF,iBAAiBA,CAAC7c,OAAO,EAAE;IACzB,OAAO,IAAI,CAAC2b,QAAQ,CAAClC,gBAAgB,CAACzZ,OAAO,CAAC;EAChD;EAEA4R,cAAcA,CAAC3K,OAAO,EAAEyK,QAAQ,EAAE9I,OAAO,EAAE;IACzC,MAAMkU,eAAe,GAAGlU,OAAO,CAACkU,eAAe;IAC/C,MAAMQ,gBAAgB,GAAG,IAAI,CAACC,eAAe,CAAC7L,QAAQ,CAAC;IACvD;IACA9I,OAAO,CAACjI,OAAO,IAAI2c,gBAAgB;IACnCR,eAAe,CAAC1a,WAAW,IAAIkb,gBAAgB;IAC/C,IAAI,CAAC3B,QAAQ,CAACjC,WAAW,CAAC,CAAC;EAC7B;EAEA0D,mBAAmBA,CAACnW,OAAO,EAAE1F,KAAK,EAAE;IAClC;IACA,IAAIA,KAAK,CAACkI,IAAI,KAAK,YAAY,EAAE;MAC/BnI,OAAO,CAACC,KAAK,CAAE,UAASA,KAAK,CAACvB,OAAQ,EAAC,CAAC;IAC1C;IACA,IAAI,CAAC2b,QAAQ,CAACjC,WAAW,CAAC,CAAC;IAC3B,IAAI,CAAC8C,UAAU,CAAC,CAAC;EACnB;EAEA,MAAMa,UAAUA,CAACpW,OAAO,EAAEyK,QAAQ,EAAE9I,OAAO,EAAE;IAC3C,MAAM6B,IAAI,GAAG7B,OAAO,CAAC6B,IAAI;IACzBnJ,OAAO,CAAC6D,GAAG,CAAE,QAAOsF,IAAI,CAACvK,EAAG,OAAM,CAAC;IACnC,MAAMuK,IAAI,CAACF,UAAU,CAAC;MACpB8P,IAAI,EAAE,WAAW;MACjB1Z,OAAO,EAAEiI,OAAO,CAACjI;IACnB,CAAC,CAAC;IACF,IAAI,CAAC6b,UAAU,CAAC,CAAC;EACnB;EAEAe,eAAe,GAAI5c,OAAO,IAAK;IAC7B;IACA,OAAOA,OAAO;EAChB,CAAC;EAED6c,UAAU,GAAGA,CAAA,KAAM;IACjB,OAAO,IAAI5Z,GAAG,CAAC/C,MAAM,CAAC4c,QAAQ,CAAC5Z,IAAI,CAAC,CAAC6Z,QAAQ,CAAC5K,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EAChE,CAAC;AACH;AAACpQ,OAAA,CAAA4Y,GAAA,GAAAA,GAAA;;;;ACnND,IAAAoC,IAAA,GAAAvU,OAAA;AACA,IAAAuB,KAAA,GAAAvB,OAAA;AACA,IAAAiB,YAAA,GAAAjB,OAAA;AAEA;AACA,eAAehI,UAAUA,CAAA,EAAG;EAC1B,MAAMkJ,UAAI,CAAClJ,UAAU,CAAC,CAAC;EACvB,MAAM+I,wBAAW,CAAC/I,UAAU,CAAC,CAAC;AAChC;AAEAA,UAAU,CAAC,CAAC,CAACkM,IAAI,CAAC,MAAM;EACtBiO,QAAG,CAACC,GAAG,CAAC,CAAC;AACX,CAAC,CAAC;;;ACZF,IAAIoC,UAAU,GAAG,4BAA4B;AAE7C,IAAIC,SAAS,GAAGC,MAAM,CAACC,MAAM,CAACC,MAAM;AAEpC,SAASA,MAAMA,CAACC,UAAU,EAAE;EAC1BJ,SAAS,CAACK,IAAI,CAAC,IAAI,EAAED,UAAU,CAAC;EAChC,IAAI,CAACE,GAAG,GAAG;IACTjZ,IAAI,EAAE4Y,MAAM,CAACC,MAAM,CAACK,OAAO;IAC3BC,gBAAgB,EAAE,EAAE;IACpBC,iBAAiB,EAAE,EAAE;IACrBC,MAAM,EAAE,SAAAA,CAAUC,EAAE,EAAE;MACpB,IAAI,CAACH,gBAAgB,CAACI,IAAI,CAACD,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC;IAClD,CAAC;IACDE,OAAO,EAAE,SAAAA,CAAUF,EAAE,EAAE;MACrB,IAAI,CAACF,iBAAiB,CAACG,IAAI,CAACD,EAAE,CAAC;IACjC;EACF,CAAC;EAEDV,MAAM,CAACC,MAAM,CAACK,OAAO,GAAG,IAAI;AAC9B;AAEAN,MAAM,CAACC,MAAM,CAACC,MAAM,GAAGA,MAAM;AAC7B,IAAIW,aAAa,EAAEC,cAAc;AAEjC,IAAIC,MAAM,GAAGf,MAAM,CAACC,MAAM,CAACc,MAAM;AACjC,IAAI,CAAC,CAACA,MAAM,IAAI,CAACA,MAAM,CAACC,eAAe,KAAK,OAAOC,SAAS,KAAK,WAAW,EAAE;EAC5E,IAAIC,QAAQ,GAAG,MAA4BvB,QAAQ,CAACuB,QAAQ;EAC5D,IAAIC,QAAQ,GAAGxB,QAAQ,CAACwB,QAAQ,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;EAC5D,IAAIC,EAAE,GAAG,IAAIH,SAAS,CAACE,QAAQ,GAAG,KAAK,GAAGD,QAAQ,GAAG,GAAG,UAAuB,GAAG,GAAG,CAAC;EACtFE,EAAE,CAACC,SAAS,GAAG,UAASpe,KAAK,EAAE;IAC7B4d,aAAa,GAAG,CAAC,CAAC;IAClBC,cAAc,GAAG,EAAE;IAEnB,IAAI1Z,IAAI,GAAG/E,IAAI,CAACoD,KAAK,CAACxC,KAAK,CAACmE,IAAI,CAAC;IAEjC,IAAIA,IAAI,CAACjF,IAAI,KAAK,QAAQ,EAAE;MAC1B,IAAImf,OAAO,GAAG,KAAK;MACnBla,IAAI,CAACma,MAAM,CAAC3S,OAAO,CAAC,UAAS4S,KAAK,EAAE;QAClC,IAAI,CAACA,KAAK,CAACC,KAAK,EAAE;UAChB,IAAIC,SAAS,GAAGC,cAAc,CAACC,MAAM,CAACC,aAAa,EAAEL,KAAK,CAACpf,EAAE,CAAC;UAC9D,IAAIsf,SAAS,EAAE;YACbJ,OAAO,GAAG,IAAI;UAChB;QACF;MACF,CAAC,CAAC;;MAEF;MACAA,OAAO,GAAGA,OAAO,IAAIla,IAAI,CAACma,MAAM,CAACO,KAAK,CAAC,UAASN,KAAK,EAAE;QACrD,OAAOA,KAAK,CAACrf,IAAI,KAAK,KAAK,IAAIqf,KAAK,CAACO,SAAS,CAACC,EAAE;MACnD,CAAC,CAAC;MAEF,IAAIV,OAAO,EAAE;QACX9d,OAAO,CAACgH,KAAK,CAAC,CAAC;QAEfpD,IAAI,CAACma,MAAM,CAAC3S,OAAO,CAAC,UAAU4S,KAAK,EAAE;UACnCS,QAAQ,CAACL,MAAM,CAACC,aAAa,EAAEL,KAAK,CAAC;QACvC,CAAC,CAAC;QAEFV,cAAc,CAAClS,OAAO,CAAC,UAAUsT,CAAC,EAAE;UAClCC,YAAY,CAACD,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC;MACJ,CAAC,MAAM,IAAIvC,QAAQ,CAACyC,MAAM,EAAE;QAAE;QAC5BzC,QAAQ,CAACyC,MAAM,CAAC,CAAC;MACnB;IACF;IAEA,IAAIhb,IAAI,CAACjF,IAAI,KAAK,QAAQ,EAAE;MAC1Bif,EAAE,CAACiB,KAAK,CAAC,CAAC;MACVjB,EAAE,CAACkB,OAAO,GAAG,YAAY;QACvB3C,QAAQ,CAACyC,MAAM,CAAC,CAAC;MACnB,CAAC;IACH;IAEA,IAAIhb,IAAI,CAACjF,IAAI,KAAK,gBAAgB,EAAE;MAClCqB,OAAO,CAAC6D,GAAG,CAAC,2BAA2B,CAAC;MAExCkb,kBAAkB,CAAC,CAAC;IACtB;IAEA,IAAInb,IAAI,CAACjF,IAAI,KAAK,OAAO,EAAE;MACzBqB,OAAO,CAACC,KAAK,CAAC,eAAe,GAAG2D,IAAI,CAAC3D,KAAK,CAACvB,OAAO,GAAG,IAAI,GAAGkF,IAAI,CAAC3D,KAAK,CAAC+e,KAAK,CAAC;MAE7ED,kBAAkB,CAAC,CAAC;MAEpB,IAAIE,OAAO,GAAGC,kBAAkB,CAACtb,IAAI,CAAC;MACtC3E,QAAQ,CAACC,IAAI,CAACiC,WAAW,CAAC8d,OAAO,CAAC;IACpC;EACF,CAAC;AACH;AAEA,SAASF,kBAAkBA,CAAA,EAAG;EAC5B,IAAIE,OAAO,GAAGhgB,QAAQ,CAACG,cAAc,CAACkd,UAAU,CAAC;EACjD,IAAI2C,OAAO,EAAE;IACXA,OAAO,CAAC7d,MAAM,CAAC,CAAC;EAClB;AACF;AAEA,SAAS8d,kBAAkBA,CAACtb,IAAI,EAAE;EAChC,IAAIqb,OAAO,GAAGhgB,QAAQ,CAACwQ,aAAa,CAAC,KAAK,CAAC;EAC3CwP,OAAO,CAACrgB,EAAE,GAAG0d,UAAU;;EAEvB;EACA,IAAI5d,OAAO,GAAGO,QAAQ,CAACwQ,aAAa,CAAC,KAAK,CAAC;EAC3C,IAAI0P,UAAU,GAAGlgB,QAAQ,CAACwQ,aAAa,CAAC,KAAK,CAAC;EAC9C/Q,OAAO,CAAC6Q,SAAS,GAAG3L,IAAI,CAAC3D,KAAK,CAACvB,OAAO;EACtCygB,UAAU,CAAC5P,SAAS,GAAG3L,IAAI,CAAC3D,KAAK,CAAC+e,KAAK;EAEvCC,OAAO,CAACrT,SAAS,GACf,wNAAwN,GACtN,mFAAmF,GACnF,yEAAyE,GACzE,qEAAqE,GAAGlN,OAAO,CAACkN,SAAS,GAAG,QAAQ,GACpG,OAAO,GAAGuT,UAAU,CAACvT,SAAS,GAAG,QAAQ,GAC3C,QACD;EAED,OAAOqT,OAAO;AAEhB;AAEA,SAASG,UAAUA,CAAC3C,MAAM,EAAE7d,EAAE,EAAE;EAC9B,IAAIygB,OAAO,GAAG5C,MAAM,CAAC4C,OAAO;EAC5B,IAAI,CAACA,OAAO,EAAE;IACZ,OAAO,EAAE;EACX;EAEA,IAAIC,OAAO,GAAG,EAAE;EAChB,IAAIC,CAAC,EAAEC,CAAC,EAAEC,GAAG;EAEb,KAAKF,CAAC,IAAIF,OAAO,EAAE;IACjB,KAAKG,CAAC,IAAIH,OAAO,CAACE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACvBE,GAAG,GAAGJ,OAAO,CAACE,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,CAAC,CAAC;MACtB,IAAIC,GAAG,KAAK7gB,EAAE,IAAKyB,KAAK,CAACqf,OAAO,CAACD,GAAG,CAAC,IAAIA,GAAG,CAACA,GAAG,CAACphB,MAAM,GAAG,CAAC,CAAC,KAAKO,EAAG,EAAE;QACpE0gB,OAAO,CAACnC,IAAI,CAACoC,CAAC,CAAC;MACjB;IACF;EACF;EAEA,IAAI9C,MAAM,CAACc,MAAM,EAAE;IACjB+B,OAAO,GAAGA,OAAO,CAACK,MAAM,CAACP,UAAU,CAAC3C,MAAM,CAACc,MAAM,EAAE3e,EAAE,CAAC,CAAC;EACzD;EAEA,OAAO0gB,OAAO;AAChB;AAEA,SAASb,QAAQA,CAAChC,MAAM,EAAEuB,KAAK,EAAE;EAC/B,IAAIqB,OAAO,GAAG5C,MAAM,CAAC4C,OAAO;EAC5B,IAAI,CAACA,OAAO,EAAE;IACZ;EACF;EAEA,IAAIA,OAAO,CAACrB,KAAK,CAACpf,EAAE,CAAC,IAAI,CAAC6d,MAAM,CAACc,MAAM,EAAE;IACvC,IAAIL,EAAE,GAAG,IAAI0C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE5B,KAAK,CAACO,SAAS,CAACC,EAAE,CAAC;IACzER,KAAK,CAACC,KAAK,GAAG,CAACoB,OAAO,CAACrB,KAAK,CAACpf,EAAE,CAAC;IAChCygB,OAAO,CAACrB,KAAK,CAACpf,EAAE,CAAC,GAAG,CAACse,EAAE,EAAEc,KAAK,CAAC6B,IAAI,CAAC;EACtC,CAAC,MAAM,IAAIpD,MAAM,CAACc,MAAM,EAAE;IACxBkB,QAAQ,CAAChC,MAAM,CAACc,MAAM,EAAES,KAAK,CAAC;EAChC;AACF;AAEA,SAASG,cAAcA,CAAC1B,MAAM,EAAE7d,EAAE,EAAE;EAClC,IAAIygB,OAAO,GAAG5C,MAAM,CAAC4C,OAAO;EAC5B,IAAI,CAACA,OAAO,EAAE;IACZ;EACF;EAEA,IAAI,CAACA,OAAO,CAACzgB,EAAE,CAAC,IAAI6d,MAAM,CAACc,MAAM,EAAE;IACjC,OAAOY,cAAc,CAAC1B,MAAM,CAACc,MAAM,EAAE3e,EAAE,CAAC;EAC1C;EAEA,IAAIye,aAAa,CAACze,EAAE,CAAC,EAAE;IACrB;EACF;EACAye,aAAa,CAACze,EAAE,CAAC,GAAG,IAAI;EAExB,IAAIkhB,MAAM,GAAGrD,MAAM,CAACsD,KAAK,CAACnhB,EAAE,CAAC;EAE7B0e,cAAc,CAACH,IAAI,CAAC,CAACV,MAAM,EAAE7d,EAAE,CAAC,CAAC;EAEjC,IAAIkhB,MAAM,IAAIA,MAAM,CAACjD,GAAG,IAAIiD,MAAM,CAACjD,GAAG,CAACE,gBAAgB,CAAC1e,MAAM,EAAE;IAC9D,OAAO,IAAI;EACb;EAEA,OAAO+gB,UAAU,CAAChB,MAAM,CAACC,aAAa,EAAEzf,EAAE,CAAC,CAACohB,IAAI,CAAC,UAAUphB,EAAE,EAAE;IAC7D,OAAOuf,cAAc,CAACC,MAAM,CAACC,aAAa,EAAEzf,EAAE,CAAC;EACjD,CAAC,CAAC;AACJ;AAEA,SAAS+f,YAAYA,CAAClC,MAAM,EAAE7d,EAAE,EAAE;EAChC,IAAIkhB,MAAM,GAAGrD,MAAM,CAACsD,KAAK,CAACnhB,EAAE,CAAC;EAC7B6d,MAAM,CAACK,OAAO,GAAG,CAAC,CAAC;EACnB,IAAIgD,MAAM,EAAE;IACVA,MAAM,CAACjD,GAAG,CAACjZ,IAAI,GAAG6Y,MAAM,CAACK,OAAO;EAClC;EAEA,IAAIgD,MAAM,IAAIA,MAAM,CAACjD,GAAG,IAAIiD,MAAM,CAACjD,GAAG,CAACG,iBAAiB,CAAC3e,MAAM,EAAE;IAC/DyhB,MAAM,CAACjD,GAAG,CAACG,iBAAiB,CAAC5R,OAAO,CAAC,UAAU6U,EAAE,EAAE;MACjDA,EAAE,CAACxD,MAAM,CAACK,OAAO,CAAC;IACpB,CAAC,CAAC;EACJ;EAEA,OAAOL,MAAM,CAACsD,KAAK,CAACnhB,EAAE,CAAC;EACvB6d,MAAM,CAAC7d,EAAE,CAAC;EAEVkhB,MAAM,GAAGrD,MAAM,CAACsD,KAAK,CAACnhB,EAAE,CAAC;EACzB,IAAIkhB,MAAM,IAAIA,MAAM,CAACjD,GAAG,IAAIiD,MAAM,CAACjD,GAAG,CAACE,gBAAgB,CAAC1e,MAAM,EAAE;IAC9DyhB,MAAM,CAACjD,GAAG,CAACE,gBAAgB,CAAC3R,OAAO,CAAC,UAAU6U,EAAE,EAAE;MAChDA,EAAE,CAAC,CAAC;IACN,CAAC,CAAC;IACF,OAAO,IAAI;EACb;AACF","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 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 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 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","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 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 if (chat) {\n // Fetch all messages for this chat\n const messages = await ChatMessage.getAllByChatId(id);\n chat.messages = messages;\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","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 { 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.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', function (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 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 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 { 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 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.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 ? this.currentMessage.nextElementSibling : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage ? this.currentMessage.previousElementSibling : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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)\n .enableInput(this.messageInput);\n this.messageInput.focus();\n }\n\n disableForm() {\n DOM.showElement(this.abortButton)\n .disableInput(this.messageInput);\n }\n\n // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion\n async sendMessage() {\n const userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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/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","name","create","save","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","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 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 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 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 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', function (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 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 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 { 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 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.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 ? this.currentMessage.nextElementSibling : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage ? this.currentMessage.previousElementSibling : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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 userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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 diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index b59ac41..a945428 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/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"],"names":[],"mappings":"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ACE;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAYJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IAAK;;EACL;IAAM;;EACN;IAAM;;EACN;IAAO;;;ACjET;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC1BF;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAEA;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC1BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAQJ;AAKA;AACA;EAIE;;ACxCF;EACE;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACjCF;EACE;;AACA;EAEE;;;AAIJ;EACE;EAEA;;;AAGF;EAEE;;;AChBF;EACE;EACA;EACA;EACA;;;ACJF;EAEE;EACA;EACA;EACA;EACA;;;ACNF;EACE;;;AAGF;AACA;EAGE;EAEA;EACA;EAMA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;;;AAGF;EACE;EACA;EAGA;;;ACtCF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE","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-size: 100%;\n font: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\n}\n","// Light theme as default\n:root {\n --primary-color: #393E46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{lighten(#222831, 20%)};\n --secondary-color-lighten-40: #{lighten(#222831, 40%)};\n --tertiary-color: #EEE;\n --error-color: #EF4040;\n --bg-color: #FAFAFA;\n --text-color: #333;\n --text-color-lighten-20: #{lighten(#eee, 20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #FFFFFF;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{lighten(#393e46, 60%)};\n --border-hover-color: #{lighten(#393e46, 40%)};\n --border-focus-color: #{lighten(#393e46, 30%)};\n --box-shadow-color: rgba(196, 204, 213, 0.7490196078);\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: #{lighten(#1c2025, 20%)};\n --secondary-color-lighten-40: #{lighten(#1c2025, 40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --text-color: #FAFAFA;\n --text-color-lighten-20: #{lighten(#FAFAFA, 20%)};\n --icon-color: var(--text-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: #ffffff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{lighten(#4f5b66, 30%)};\n --border-hover-color: #{lighten(#4f5b66, 50%)};\n --border-focus-color: #{lighten(#4f5b66, 60%)};\n --box-shadow-color: rgba(40, 48, 57, 0.7490196078);\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 //margin-top: 0.5em;\n //margin-bottom: 0.5em;\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.col {\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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 //content: \"\\2699\"; // Gear\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n //content: \"\\00D7\"; /* Unicode for ✖ */\n // content: '\\274C'; // ❌\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\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\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n","/* Styling for lists */\nul {\n //background: white;\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\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 // font-weight: 500;\n //border-bottom: 1px solid #ececec;\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 // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n //@extend %box-shadow;\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 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}\n\nbutton {\n padding: 0.75rem 1rem;\n border: none;\n // border-radius: var(--border-radius);\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n\n // @extend %box-shadow;\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 //color: var(--button-primary-color);\n //background-color: var(--button-primary-bgcolor);\n}\n\n.button-primary:hover {\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\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\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 50% {\n transform: scale(1.3);\n opacity: 0.7;\n }\n 100% {\n transform: scale(0.9);\n opacity: .8;\n }\n}\n\n%dot2 {\n width: 24px;\n height: 24px;\n background-color: blue;\n border-radius: 50%;\n animation: pulse 2s infinite, changeColor 4s infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes changeColor {\n 0% { background-color: blue; }\n 33% { background-color: red; }\n 67% { background-color: green; }\n 100% { background-color: blue; }\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",".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 //padding: 20px;\n //border-top: 1px solid #ccc;\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 #cccccc;\n @extend %box-shadow;\n z-index: 4;\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 .button {\n //padding: 0.25rem;\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 .chat-message-text {\n // color: var(--text-color-lighten-20);\n }\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\n .chat-title {\n // text-overflow: ellipsis;\n mask-image: linear-gradient(90deg, var(--white) 95%, transparent); // Fade out title instead of ellipsis\n }\n}\n\n.list-item.selected {\n background: var(--white);\n @extend %box-shadow;\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n}\n","#chat-title {\n @extend %font-weight-boldest;\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n // NOTE: This should be the same as chat-header border-bottom\n border-right: 1px solid #cccccc5e;\n\n min-width: 200px;\n max-width: 480px;\n\n //flex: 0 0 250px; /* fixed width */\n\n //background-color: #E3F2FD;\n //border-right: 1px solid #cfcfcf;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n // TODO: Animations\n // transition: display 0.4s;\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n max-width: 0;\n display: none;\n\n //flex: 0 0 0px; /* Collapsed state with zero width */\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\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 background-color: var(--text-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n @extend %box-shadow-modal;\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-message {\n}\n\n.notification-error {\n background: var(--error-color);\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/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"],"names":[],"mappings":"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ACE;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AC3EJ;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC1BF;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAEA;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC1BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAQJ;AAKA;AACA;EAIE;;ACxCF;EACE;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACjCF;EACE;;AACA;EAEE;;;AAQJ;EACE;EAEA;;;AAGF;EAEE;;;ACpBF;EACE;EACA;EACA;EACA;;;ACJF;EAEE;EACA;EACA;EACA;EACA;;;ACNF;EACE;;;AAGF;AACA;EAGE;EAEA;EACA;EAMA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;;;AAGF;EACE;EACA;EAGA;;;ACtCF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE","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-size: 100%;\n font: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\n}\n","// Light theme as default\n:root {\n --primary-color: #393E46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{lighten(#222831, 20%)};\n --secondary-color-lighten-40: #{lighten(#222831, 40%)};\n --tertiary-color: #EEE;\n --error-color: #EF4040;\n --bg-color: #FAFAFA;\n --text-color: #333;\n --text-color-lighten-20: #{lighten(#eee, 20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #FFFFFF;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{lighten(#393e46, 60%)};\n --border-hover-color: #{lighten(#393e46, 40%)};\n --border-focus-color: #{lighten(#393e46, 30%)};\n --box-shadow-color: rgba(196, 204, 213, 0.7490196078);\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: #{lighten(#1c2025, 20%)};\n --secondary-color-lighten-40: #{lighten(#1c2025, 40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --text-color: #FAFAFA;\n --text-color-lighten-20: #{lighten(#FAFAFA, 20%)};\n --icon-color: var(--text-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: #ffffff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{lighten(#4f5b66, 30%)};\n --border-hover-color: #{lighten(#4f5b66, 50%)};\n --border-focus-color: #{lighten(#4f5b66, 60%)};\n --box-shadow-color: rgba(40, 48, 57, 0.7490196078);\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 //margin-top: 0.5em;\n //margin-bottom: 0.5em;\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.col {\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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 //content: \"\\2699\"; // Gear\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n //content: \"\\00D7\"; /* Unicode for ✖ */\n // content: '\\274C'; // ❌\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\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\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n","/* Styling for lists */\nul {\n //background: white;\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\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 // font-weight: 500;\n //border-bottom: 1px solid #ececec;\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 // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n //@extend %box-shadow;\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 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}\n\nbutton {\n padding: 0.75rem 1rem;\n border: none;\n // border-radius: var(--border-radius);\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n\n // @extend %box-shadow;\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 //color: var(--button-primary-color);\n //background-color: var(--button-primary-bgcolor);\n}\n\n.button-primary:hover {\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\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 50% {\n transform: scale(1.3);\n opacity: 0.7;\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 changeColor 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes changeColor {\n 0% {\n background-color: blue;\n }\n 33% {\n background-color: red;\n }\n 67% {\n background-color: green;\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",".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 //padding: 20px;\n //border-top: 1px solid #ccc;\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 #cccccc;\n @extend %box-shadow;\n z-index: 4;\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 .button {\n //padding: 0.25rem;\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 .chat-message-text {\n // color: var(--text-color-lighten-20);\n }\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\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\n.list-item.selected {\n background: var(--white);\n @extend %box-shadow;\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n}\n","#chat-title {\n @extend %font-weight-boldest;\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n // NOTE: This should be the same as chat-header border-bottom\n border-right: 1px solid #cccccc5e;\n\n min-width: 200px;\n max-width: 480px;\n\n //flex: 0 0 250px; /* fixed width */\n\n //background-color: #E3F2FD;\n //border-right: 1px solid #cfcfcf;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n // TODO: Animations\n // transition: display 0.4s;\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n max-width: 0;\n display: none;\n\n //flex: 0 0 0px; /* Collapsed state with zero width */\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\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 background-color: var(--text-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n @extend %box-shadow-modal;\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-message {\n}\n\n.notification-error {\n background: var(--error-color);\n}\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js index 83e69c1..7662b7c 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 + ':' + "63383" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "49208" + '/'); 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 9e6e6ed..b993f4e 100644 --- a/index.html +++ b/index.html @@ -61,6 +61,13 @@ + diff --git a/js/App.js b/js/App.js index af2aad4..72249cf 100644 --- a/js/App.js +++ b/js/App.js @@ -85,14 +85,12 @@ Parameters: ${JSON.stringify(Settings.getModelParameters())} }; enableForm() { - DOM.hideElement(this.abortButton) - .enableInput(this.messageInput); + DOM.hideElement(this.abortButton).enableInput(this.messageInput); this.messageInput.focus(); } disableForm() { - DOM.showElement(this.abortButton) - .disableInput(this.messageInput); + DOM.showElement(this.abortButton).disableInput(this.messageInput); } // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion diff --git a/js/App.test.js b/js/App.test.js index 6d66ebd..668bd3b 100644 --- a/js/App.test.js +++ b/js/App.test.js @@ -30,14 +30,14 @@ const GITHUB_ACTIONS = process.env.GITHUB_ACTIONS === 'true' || false; class AppTest { async start() { - const viewportSize = { width: 1280, height: 720 } + const viewportSize = { width: 1280, height: 720 }; const contextOptions = {}; const launchOptions = { slowMo: 500, // Video slow motion value in milliseconds - } + }; if (DARK_MODE) { - contextOptions.forcedColors = 'active' // Enable forced colors mode - contextOptions.colorScheme = 'dark' // Set color scheme to dark + contextOptions.forcedColors = 'active'; // Enable forced colors mode + contextOptions.colorScheme = 'dark'; // Set color scheme to dark } if (VIDEO) { contextOptions.recordVideo = { @@ -112,7 +112,7 @@ class AppTest { // await this.screenshot('1.png'); // Wait for response // await this.page.waitForTimeout(3000); - await this.page.waitForSelector('#message-input', { state: 'visible' }) + await this.page.waitForSelector('#message-input', { state: 'visible' }); //await this.page.waitForSelector('#send-button', { timeout: 180000 }); // await this.screenshot('2.png'); } diff --git a/js/DownloadChatsButton.js b/js/DownloadChatsButton.js new file mode 100644 index 0000000..65b097c --- /dev/null +++ b/js/DownloadChatsButton.js @@ -0,0 +1,66 @@ +import { Chat } from './models/Chat.js'; +import { ChatMessage } from './models/ChatMessage.js'; + +export class DownloadChatsButton { + constructor() { + this.button = document.querySelector('#export-button'); + this.bindEventListeners(); + } + + bindEventListeners() { + this.button.addEventListener('click', () => { + this.exportChat(); + this.exportChatMessages(); + }); + } + + async exportChat() { + const request = await Chat.export(); + + request.onsuccess = function () { + let data = request.result; + + // Convert the data to JSON format + let jsonData = JSON.stringify(data, 2); + + // Export the JSON data by creating a file to download + let blob = new Blob([jsonData], { type: 'application/json' }); + let url = URL.createObjectURL(blob); + + let a = document.createElement('a'); + a.href = url; + a.download = 'chats.json'; + a.click(); + URL.revokeObjectURL(url); + }; + + request.onerror = function (event) { + console.error('Error reading data: ', event.target.errorCode); + }; + } + + async exportChatMessages() { + const request = await ChatMessage.export(); + + request.onsuccess = function () { + let data = request.result; + + // Convert the data to JSON format + let jsonData = JSON.stringify(data, 2); + + // Export the JSON data by creating a file to download + let blob = new Blob([jsonData], { type: 'application/json' }); + let url = URL.createObjectURL(blob); + + let a = document.createElement('a'); + a.href = url; + a.download = 'chat_messages.json'; + a.click(); + URL.revokeObjectURL(url); + }; + + request.onerror = function (event) { + console.error('Error reading data: ', event.target.errorCode); + }; + } +} diff --git a/js/Sidebar.js b/js/Sidebar.js index 1b676e1..a4ae4dc 100644 --- a/js/Sidebar.js +++ b/js/Sidebar.js @@ -3,6 +3,7 @@ import { Event } from './Event.js'; import { Chat } from './models/Chat.js'; import { AppController } from './AppController.js'; import { ChatList } from './ChatList.js'; +import { DownloadChatsButton } from './DownloadChatsButton.js'; import { LocalStorage } from './models/LocalStorage.js'; export class Sidebar { @@ -14,6 +15,7 @@ export class Sidebar { this.clearButton = this.element.querySelector('#clear-button'); this.hamburgerButton = document.getElementById('hamburger-menu'); this.searchButton = document.getElementById('search-button'); + this.downloadChatsButton = new DownloadChatsButton(); this.searchRow = document.getElementById('search-row'); this.searchInput = document.getElementById('search-input'); if (this.settings.get('sidebar-collapsed') === true) { diff --git a/js/models/BaseModel.js b/js/models/BaseModel.js index 2350d75..a067f76 100644 --- a/js/models/BaseModel.js +++ b/js/models/BaseModel.js @@ -80,4 +80,11 @@ export class BaseModel { }; }); } + + // Exports the whole store + static async export() { + let transaction = await this.db.transaction(this.storeName, 'readonly'); + let store = await transaction.transaction.objectStore(this.storeName); + return store.getAll(); + } } diff --git a/js/models/Chat.js b/js/models/Chat.js index d01875c..1f4eb01 100644 --- a/js/models/Chat.js +++ b/js/models/Chat.js @@ -25,11 +25,13 @@ export class Chat extends BaseModel { static async get(id) { const chat = await super.get(id); + /* if (chat) { // Fetch all messages for this chat const messages = await ChatMessage.getAllByChatId(id); chat.messages = messages; } + */ return chat; } From 0ec2f1c806b577700301a8978238e8b98a1102b6 Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Sun, 7 Jan 2024 16:17:05 +0200 Subject: [PATCH 2/5] Run linters --- css/ChatForm.scss | 1 + css/ChatHeader.scss | 5 +++- css/ChatHistory.scss | 7 ----- css/ChatList.scss | 4 +++ css/ChatTitle.scss | 1 + css/CopyButton.scss | 11 -------- css/Sidebar.scss | 12 +-------- css/Tabs.scss | 3 --- css/UINotification.scss | 6 ++--- css/button.scss | 16 ------------ css/colors.scss | 46 ++++++++++++++++----------------- css/form.scss | 10 +++---- css/grid.scss | 3 --- css/icons.scss | 3 --- css/list.scss | 8 +----- css/placeholders.scss | 3 --- css/reset.scss | 2 +- css/spinner.scss | 10 +++++-- dist/script.d573be0b.js | 2 +- dist/script.d573be0b.js.map | 2 +- dist/theme.7fcc2895.css | 31 +++++++++++----------- dist/theme.7fcc2895.css.map | 2 +- dist/theme.7fcc2895.js | 2 +- js/ChatArea.js | 24 ++++++++++++----- screenshots/chat-collapsed.png | Bin 47800 -> 40161 bytes screenshots/chat.png | Bin 50847 -> 42563 bytes scripts/server.js | 10 +++---- 27 files changed, 94 insertions(+), 130 deletions(-) delete mode 100644 css/CopyButton.scss diff --git a/css/ChatForm.scss b/css/ChatForm.scss index 335a29a..7860ba1 100644 --- a/css/ChatForm.scss +++ b/css/ChatForm.scss @@ -2,6 +2,7 @@ flex: 0 0 60px; /* fixed height */ display: flex; align-items: center; + // NOTE: Should match #chat-header border-bottom border-top: 1px solid #cccccc5e; diff --git a/css/ChatHeader.scss b/css/ChatHeader.scss index 827a666..2ad96e6 100644 --- a/css/ChatHeader.scss +++ b/css/ChatHeader.scss @@ -1,8 +1,11 @@ #chat-header { // NOTE: Should match #chat-form border-top - border-bottom: 1px solid #cccccc; + border-bottom: 1px solid #ccc; + @extend %box-shadow; + z-index: 4; + .button { height: 100%; } diff --git a/css/ChatHistory.scss b/css/ChatHistory.scss index c36bcc4..edfdb13 100644 --- a/css/ChatHistory.scss +++ b/css/ChatHistory.scss @@ -22,10 +22,6 @@ top: 0; right: 0; } - - .button { - //padding: 0.25rem; - } } /* Styling for user messages */ @@ -35,8 +31,5 @@ /* Styling for system messages */ .assistant-chat-message { - .chat-message-text { - // color: var(--text-color-lighten-20); - } margin-bottom: 0.5rem; } diff --git a/css/ChatList.scss b/css/ChatList.scss index 55ed2e2..7ed3fcd 100644 --- a/css/ChatList.scss +++ b/css/ChatList.scss @@ -1,5 +1,6 @@ .chat-list-item { z-index: 2; + .chat-title { // text-overflow: ellipsis; mask-image: linear-gradient( @@ -12,11 +13,14 @@ .list-item.selected { background: var(--white); + @extend %box-shadow; + z-index: 2; } .list-item.hover { @extend %box-shadow-hover; + z-index: 3; } diff --git a/css/ChatTitle.scss b/css/ChatTitle.scss index 2a27c02..d9f23fa 100644 --- a/css/ChatTitle.scss +++ b/css/ChatTitle.scss @@ -1,5 +1,6 @@ #chat-title { @extend %font-weight-boldest; + padding: 0.5rem 0.25rem; font-size: 1.2rem; text-overflow: ellipsis; diff --git a/css/CopyButton.scss b/css/CopyButton.scss deleted file mode 100644 index c40d307..0000000 --- a/css/CopyButton.scss +++ /dev/null @@ -1,11 +0,0 @@ -.copy-button { - //font-family: Arial, sans-serif; /* Ensures the Unicode character displays correctly */ - //font-size: 16px; /* Adjust as needed */ - //padding: 10px; - //background-color: #4CAF50; - //color: white; - //padding: 0.5rem; - //border: none; - //border-radius: 5px; - //cursor: pointer; -} diff --git a/css/Sidebar.scss b/css/Sidebar.scss index ae67b2a..04fb223 100644 --- a/css/Sidebar.scss +++ b/css/Sidebar.scss @@ -5,16 +5,11 @@ aside { /* Sidebar styling */ #sidebar { @extend %box-shadow; + // NOTE: This should be the same as chat-header border-bottom border-right: 1px solid #cccccc5e; - min-width: 200px; max-width: 480px; - - //flex: 0 0 250px; /* fixed width */ - - //background-color: #E3F2FD; - //border-right: 1px solid #cfcfcf; overflow-y: auto; .buttons { @@ -22,9 +17,6 @@ aside { display: flex; flex-grow: 1; } - - // TODO: Animations - // transition: display 0.4s; } #search-input { @@ -34,7 +26,5 @@ aside { #sidebar.collapsed { max-width: 0; display: none; - - //flex: 0 0 0px; /* Collapsed state with zero width */ padding: 0; } diff --git a/css/Tabs.scss b/css/Tabs.scss index 802aa9b..b50b667 100644 --- a/css/Tabs.scss +++ b/css/Tabs.scss @@ -17,7 +17,4 @@ .tab-content { display: none; - - //padding: 20px; - //border-top: 1px solid #ccc; } diff --git a/css/UINotification.scss b/css/UINotification.scss index f3f4393..76577f7 100644 --- a/css/UINotification.scss +++ b/css/UINotification.scss @@ -3,13 +3,14 @@ top: 0; left: 0; color: var(--bg-color); - background-color: var(--text-color); width: calc(100vw - 2rem); z-index: 30000; background-color: var(--bg-color); padding: 1rem; margin: 1rem; + @extend %box-shadow-modal; + border-radius: var(--border-radius); .button { @@ -19,9 +20,6 @@ } } -.notification-message { -} - .notification-error { background: var(--error-color); } diff --git a/css/button.scss b/css/button.scss index 0a5dcce..1bba664 100644 --- a/css/button.scss +++ b/css/button.scss @@ -1,12 +1,8 @@ button { background-color: var(--button-secondary-bgcolor); z-index: 1; -} - -button { padding: 0.75rem 1rem; border: none; - // border-radius: var(--border-radius); cursor: pointer; i { @@ -18,10 +14,6 @@ button { button:hover, button.selected { @extend %box-shadow-hover; - //color: var(--button-primary-color); - //background-color: var(--light-color); - - // @extend %box-shadow; } .button-small { @@ -36,14 +28,6 @@ button.selected { .button-primary { @extend %font-weight-boldest; @extend %box-shadow; - - //color: var(--button-primary-color); - //background-color: var(--button-primary-bgcolor); -} - -.button-primary:hover { - //color: var(--button-primary-color); - //background-color: var(--light-color); } .buttons { diff --git a/css/colors.scss b/css/colors.scss index 957adb9..46aac5a 100644 --- a/css/colors.scss +++ b/css/colors.scss @@ -1,24 +1,24 @@ // Light theme as default :root { - --primary-color: #393E46; + --primary-color: #393e46; --secondary-color: #222831; - --secondary-color-lighten-20: #{lighten(#222831, 20%)}; - --secondary-color-lighten-40: #{lighten(#222831, 40%)}; - --tertiary-color: #EEE; - --error-color: #EF4040; - --bg-color: #FAFAFA; + --secondary-color-lighten-20: #{color.adjust(#222831, $lightness:20%)}; + --secondary-color-lighten-40: #{color.adjust(#222831, $lightness:40%)}; + --tertiary-color: #eee; + --error-color: #ef4040; + --bg-color: #fafafa; --text-color: #333; - --text-color-lighten-20: #{lighten(#eee, 20%)}; + --text-color-lighten-20: #{color.adjust(#eee, $lightness:20%)}; --icon-color: var(--primary-color); - --light-text-color: #FFFFFF; + --light-text-color: #fff; --button-primary-color: var(--primary-color); - --button-primary-bgcolor: #FFFFFF; + --button-primary-bgcolor: #fff; --button-secondary-color: var(--text-color); --button-secondary-bgcolor: $bg-color; - --border-color: #{lighten(#393e46, 60%)}; - --border-hover-color: #{lighten(#393e46, 40%)}; - --border-focus-color: #{lighten(#393e46, 30%)}; - --box-shadow-color: rgba(196, 204, 213, 0.7490196078); + --border-color: #{color.adjust(#393e46, 60%)}; + --border-hover-color: #{color.adjust(#393e46, $lightness:40%)}; + --border-focus-color: #{color.adjust(#393e46, $lightness:30%)}; + --box-shadow-color: rgb(196 204 213 / 74.9%); --box-shadow-modal-color: #444; --modal-header-bg-color: var(--primary-color); } @@ -28,23 +28,23 @@ :root { --primary-color: #4f5b66; --secondary-color: #1c2025; - --secondary-color-lighten-20: #{lighten(#1c2025, 20%)}; - --secondary-color-lighten-40: #{lighten(#1c2025, 40%)}; + --secondary-color-lighten-20: #{color.adjust(#1c2025, $lightness:20%)}; + --secondary-color-lighten-40: #{color.adjust(#1c2025, $lightness:40%)}; --tertiary-color: #d1d1d1; --error-color: #ff6b6b; --bg-color: #121212; - --text-color: #FAFAFA; - --text-color-lighten-20: #{lighten(#FAFAFA, 20%)}; + --text-color: #fafafa; + --text-color-lighten-20: #{color.adjust(#fafafa, $lightness:20%)}; --icon-color: var(--text-color); - --light-text-color: #FFFFFF; - --button-primary-color: #ffffff; + --light-text-color: #fff; + --button-primary-color: #fff; --button-primary-bgcolor: var(--primary-color); --button-secondary-color: var(--text-color); --button-secondary-bgcolor: var(--bg-color); - --border-color: #{lighten(#4f5b66, 30%)}; - --border-hover-color: #{lighten(#4f5b66, 50%)}; - --border-focus-color: #{lighten(#4f5b66, 60%)}; - --box-shadow-color: rgba(40, 48, 57, 0.7490196078); + --border-color: #{color.adjust(#4f5b66, $lightness:30%)}; + --border-hover-color: #{color.adjust(#4f5b66, $lightness:50%)}; + --border-focus-color: #{color.adjust(#4f5b66, $lightness:60%)}; + --box-shadow-color: rgb(40 48 57 / 74.9%); --box-shadow-modal-color: #444; --modal-header-bg-color: var(--bg-color); } diff --git a/css/form.scss b/css/form.scss index 2f27459..dd9b933 100644 --- a/css/form.scss +++ b/css/form.scss @@ -5,6 +5,11 @@ label { display: block; } +textarea { + padding: 0.5rem; + resize: none; +} + input, textarea { width: 100%; @@ -36,8 +41,3 @@ textarea:hover { .input { margin-bottom: 0.5rem; } - -textarea { - padding: 0.5rem; - resize: none; -} diff --git a/css/grid.scss b/css/grid.scss index 9cf5ce9..82e88e4 100644 --- a/css/grid.scss +++ b/css/grid.scss @@ -5,9 +5,6 @@ width: 100%; /* Container takes full width */ } -.col { -} - .grw { flex-grow: 1; } diff --git a/css/icons.scss b/css/icons.scss index 7ce1aa7..744ede9 100644 --- a/css/icons.scss +++ b/css/icons.scss @@ -49,7 +49,6 @@ svg { .icon-settings::before { content: '\1F6E0'; /* Unicode for wrench */ - //content: "\2699"; // Gear } .icon-refresh::before { @@ -67,8 +66,6 @@ svg { .icon-abort::before { content: '\00D7'; color: var(--red); - //content: "\00D7"; /* Unicode for ✖ */ - // content: '\274C'; // ❌ } .icon-save::before { diff --git a/css/list.scss b/css/list.scss index a0ed9bd..24936ed 100644 --- a/css/list.scss +++ b/css/list.scss @@ -1,6 +1,5 @@ /* Styling for lists */ ul { - //background: white; display: flex; flex-direction: column; width: 100%; @@ -12,8 +11,6 @@ ul { padding: 0.5rem 0.75rem; cursor: pointer; width: 100%; - // font-weight: 500; - //border-bottom: 1px solid #ececec; white-space: nowrap; /* Prevent text from wrapping */ .col { @@ -35,12 +32,9 @@ ul { li.selected { @extend %font-weight-boldest; + // NOTE: Should match #chat-header border-bottom border-top: 1px solid #cccccc5e; - - //color: var(--button-primary-color); - //background-color: var(--light-color); - //@extend %box-shadow; } li.selected::after { diff --git a/css/placeholders.scss b/css/placeholders.scss index 7757056..f3ec7e3 100644 --- a/css/placeholders.scss +++ b/css/placeholders.scss @@ -34,7 +34,4 @@ @extend %font-weight-boldest; font-size: 2rem; - - //margin-top: 0.5em; - //margin-bottom: 0.5em; } diff --git a/css/reset.scss b/css/reset.scss index 780f4ff..f5e9158 100644 --- a/css/reset.scss +++ b/css/reset.scss @@ -83,7 +83,7 @@ video { padding: 0; border: 0; font-size: 100%; - font: inherit; + font-family: inherit; vertical-align: baseline; } diff --git a/css/spinner.scss b/css/spinner.scss index c3e5ecd..fd300fd 100644 --- a/css/spinner.scss +++ b/css/spinner.scss @@ -30,10 +30,12 @@ transform: scale(1); opacity: 1; } + 50% { transform: scale(1.3); opacity: 0.7; } + 100% { transform: scale(0.9); opacity: 0.8; @@ -47,7 +49,7 @@ border-radius: 50%; animation: pulse 2s infinite, - changeColor 4s infinite; + change-color 4s infinite; } @keyframes pulse { @@ -56,22 +58,26 @@ transform: scale(1); opacity: 1; } + 50% { transform: scale(1.2); opacity: 0.7; } } -@keyframes changeColor { +@keyframes change-color { 0% { background-color: blue; } + 33% { background-color: red; } + 67% { background-color: green; } + 100% { background-color: blue; } diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index 81582ea..2a3da09 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -2086,7 +2086,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 + ':' + "49208" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "50064" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/script.d573be0b.js.map b/dist/script.d573be0b.js.map index aba5f61..e8a20f9 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/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","name","create","save","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","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 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 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 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 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', function (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 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 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 { 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 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.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 ? this.currentMessage.nextElementSibling : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage ? this.currentMessage.previousElementSibling : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage) this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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 userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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/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","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","name","create","save","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App"],"mappings":";;AgCAA,IAAA6e,IAAA,GAAAhV,OAAA;AACA,IAAAwB,KAAA,GAAAxB,OAAA;AACA,IAAAkB,YAAA,GAAAlB,OAAA;AAEA;ADJA,ArBAA,AoBAA,ADAA,AhBAA,AFAA,AeAA,AEAA,AXAO,AZAA,AFAA,AgBAA,ALAP,AFAO,AQAA,AlBAA,AyBAA,ALAA,AhBAA,AeAP,AGAA,ANAO,AOAP,ATAA,AhBAA,AIAO,AGAP,AEAA,ADAA,AOAO,AQAP,AtBAO,A+BKP,IDLA0O,ArBAAnN,AoBAAa,AjBAAb,AFAAa,AeAAA,AEAAb,AdAAC,AUAA2M,ACAAM,ATAAzI,ATAAjG,AEAAgB,ADAAA,AeAAQ,ENAa+G,AZAAnL,AFAAhB,AgBAA+P,APAAjJ,AQAAsJ,AlBAA/Q,AyBAAgU,ALAApC,AhBAAjO,AYAA6J,AHAAjD,AdAAvM,GEAG,AWAhB,AUAA,AxBASrD,AIAOwG,CMAhB,AGAA,AeAA,AzBAiB,AmBAA,AGAjB,AFAA,CrBAkB,AoBAA,CRAlBqD,AZAmB,AsBAnBA,CdAAA,AGAAA,AeAAA,AHAAA,ATAA,ATAA,AgBAAA,ClBAqB,AIArB,ADAA,APAqB,CIAC,AsBAA,ATAA,AjBAA,A+BKPhI,CfLQ,AUAA,ArBAA,AYAA,AFAvBgI,ATAAA,CUAwB,ALAA,ANAA,AFAArD,AKAxBqD,ADAAA,CsBAA,AnBAA,AeAA,AdAyB,AQAA,AhBAApD,AWAA,CgBAzB,AjBAA,AMA0B,AIA1B,AxBAmBzG,AeAO,CLA1B,AGAA,AeAA,ATA2B,AMA3B,AzBAoBC,AuBApB,COAA4J,AnBAAA,AeAAA,APA4B,CYA5BA,A3BA6B,CYA7B,AhBAuB,AOAvB,CHA+BnD,AKA/B,ADAA,CRAyB,AgCKA7E,CAAA,EFLzB,AnBAA,AeAA,AtBAmC,A4BKP,CDL5B,C3BAqC;A2BCrC,ArBAA,AoBAA,ADAO,AhBAP,AFCO,AeDP,AEAA,AdAA,AOAO,AGAP,ACAA,ATAA,ATAA,AEAA,ADCO,AeDP,ENAErB,AZAAA,AFAA,AgBAAA,APAAA,AQAAA,AlBAA,AyBAAA,ALAAA,AhBAA,AYAAA,AlBAA,AIAA,AWAA,AdAA,A+BKA,EDLF8K,ArBAAD,AoBAAD,AjBAAyC,AaAAzC,AEAAa,AdAAlB,AUAAK,ACAAmN,ATAAnN,ATAAtB,AEAAiB,AcAAO,EMAauO,AlBCA3N,AUDA2K,ArBAP3W,AIAAyG,AICOkE,EwBILG,CtBLR,APAS/E,ADAAX,AIAAsC,CwBAT,AJAA,AFAA,ARAA,AhBAU,CqBAQ,CXAlBiC,AWAmB,CUAnB,ADAAA,AJAAA,ATAarJ,AZAAA,AcAAA,APAAA,AQAAA,AOAAA,ALAAA,AEAbqJ,ANAarJ,AFAbqJ,AhBAa,AIAA,AmBAb,CMAqB,AZAR,AZAC5C,AcAD,APAC8F,AQAD,AOAC7G,ALAAgR,AJAD,AlBAC,C6BAQ,A3BAP5R,AKAf,CwBAAuE,AdAgB,AEAA,ALAhB,AMAgB,AlBAAtE,AIAA,AYAA,ATAhB,AcAAsE,CVAA,ALCwB,CGAC,AiBDzB,ArBAAA,AyBKY,CtBLZ,ACC0B,AGD1BA,ARAmB,AmBAnB,AhBAAA,AuBKahI,CFLb,AjBAAgI,AaAA,ArBAoB,AFAA5D,AGAA,AkBApB,ARAA,CYAA4D,AzBAqB3D,AwBAA,CtBACgB,AOAA,AaAtB2C,CMAA,AJAuB,AJAvB,CXAwB,CVAC,AoBAA,AfAzB,COAA,ALAA,ADCiCE,CKDjC,AXA2BvE,AoBAA2R,CMA3B,AzBA4B,CsBA5B,AOKuB,C7BLO,A6BKN,CAAC,CVLO,EjBAE,AHAA,AoBAA/K,EjBAEjF,AHAA,MoBAM,EAAE,EjBAE,AGCJ,CAAC,CHDK;A0BChD,ArBAA,AoBAA,AjBAA,AaAA,AECO,AdAA,AUDP,ACAA,ATAA,ATCO,AEAA,AcDP,EMAE3G,AlBCAA,ALDA,AeAAA,ArBAA,AICA,AIAA,AODA8C,AdAA,A+BKA,EDLF8H,ArBAAL,AoBAAmP,AjBAApM,AaAAwK,ATAItX,AZAA,AFAAkF,AgBAAlF,APAA,AQAA,AlBAAM,AyBAA,ALAA,AEAJ2W,ANAI,AOAJO,ATAAnN,AOAAqM,CRAKpU,CaCQiW,AdAAzK,APAA/E,AEAAiB,AMDPvJ,CfAC,CKAC,AOAA,AQAA,AOAA,ALAA,AJAA,AcKAoJ,C3BLC5D,AOAA+F,AQAAqJ,AOAAnQ,ALAAnF,AhBAAqH,AYAA0K,AFAT,AZCS,AWDA,AdAAxP,C8BAT,ALAA,AxBAU,AOCO,CNDN,ADAA/B,AsBAX,AxBAWpB,AeAAoD,CEAC,AdAAT,AgBAA,AHAZ+G,AhBAY,ACAAvG,C8BAZuG,AFAarJ,AlBCAA,AeDbqJ,ATAatI,AEAAA,AEAAf,ApBAAiB,C6BAb,ADAa,AlBCC0J,AUDArK,AGAd+I,ADAA,CKCsB,AvBDP,AoBAf,AzBAe,AOCO,ACAPhI,CEDf,AmBAgB,AhBAhB,AeCuB,ADDP,ArBAAuG,ANAA,AOCO,AQDP,AdAA,C6BAhByB,AxBAiBZ,AiBAjBY,CZCkB,ANDA5C,AOAA,AUAA,AGAlB4C,AzBAkB1J,AICAyG,AWDA,AdAArD,CSAlBsG,AGAAA,AcAmB3D,ANAA,ALAnB,AhBAmB,ASCO6D,CsBD1B,ApBCoBoC,AeDpB,CvBAqB,ASAAnL,AUAAA,ADAA,AGArB,CrBAsBmC,AHAAlD,CoBAC,AnBAA,C6BAvB,AzBAwB,AaAA,AKAxB,CTCgC,ARDP,AmBAzB,AzBAyB,AQCA4B,APDA,CSAzB,AGAA,ACCiC,AMDP,AOAA,A3BAAzB,AQCD,CNDE,AIAA8H,AYAA,CPCC,ARDA,ADAA3C,AMCA,CSDC,AdAA,AgBAA,APAA,AUAA,AlBCAqB,COACwF,AMDA,AEAA,APAAa,AUAA9L,AlBCD,CcDE,ClBAC,AICO,A4BIpB,CAACU,ChCLc1B,CAAC,EiBAE,AdAA,AgBAA,AjBAA,AFAA,CWCC,ARDA,AGAA,CWAC,AEACqB,AjBAAA,AFAD,ASCJ,CEAK,ALDA6G,AGCJ,GWDO,AYKb,CbLe,AjBAA,AoBAD,AUKb,CVLc6O,AUKb,CpBLc,CAACnK,COAG,AjBAA,CeADvL,CXAC,EAAE,EWAE,CLAC,CKAC,ALAA,AUAA,CAAC;ASCzD,ArBAA,AoBAA,AjBAA,AaAA,AFCO,ACDP,ATAA,AOCO,ASIP,EJJEhB,AdAAA,AIDA,AXCAA,AEAA,EsBDFyb,ArBAA3Q,AoBAA6O,ADAI,AhBAJ9O,AFCI,AeDJ4M,ArBAI,AFAA,ASAA,AQAA,AOAA/R,ALAA,AhBAAnE,AeAA,AIAJkW,ATAAhM,AhBAI,AIAmC,AICnC,AODA,AdAA,EgBAE,AEAA,AjBAAzG,AsBCO0S,ADAAP,EQDb,AFAQ,AlBCA,ANDA,AOAA,AQAA,AEAA,ADAA,AZCA1M,AMDA,AdAA,C4BAC6O,AhBAT,AFCS3O,ANDAjE,AOAAgG,AQAAoJ,AEAAa,ADAArW,CrBACT,AQCA,CuBDVwJ,ALAA,AvBAW,AwBAA,ArBAA,AmBAX,CZAAA,AcAYyP,ArBAA9W,AiBCO,CbDnB,ACCa,AiBAAhC,AdAAA,AZDA,AEA0ByB,AGC1BzB,AgBAO,CODpB,AJAAqJ,AECa,AdAA,AZDCrI,AoBAA,ADAA,AIAdqI,AzBAc,AOCAlE,ACAA,CLDC,AKCAsD,CEDfY,ACCgBsB,AiBAA,AdAA,AUAO,CMDvBtB,ARAiBsN,AhBAA,AeAArW,AGCO,AxBDPb,AIAsB,C2BAvC,AzBCO,AUDP,ATCkB,AEAAgL,CIDlB,AXAmB,AOCAtF,CoBDC,AlBCA,ACDA,AVAAF,AFAA,AIAmBvD,AGCnB,CmBDpB,ArBAqB,AsBAA,AFArB,ATAA2H,AhBAqBvJ,CoBAC,AEAA,ADAA,CXAtB,AmBAuBU,AjBAA,AHCA,ADAA,CsBDvB,AzBAwBkG,AsBAA,AnBCA,CYDClG,AXCA,CPDC,CUAC,AVAA,CyBAC,AXA5B,CZAuC,CAAAZ,CyBAR,A7BAA,C6BACe,A7BAAhB,CoBAC,ApBAA,AQCA,CYDC8M,ApBAA,CQCC,CHDC,ADAG,EAAN9K,IAAI,IyBAS,CAAC,EzBAVC,CgBAa,AZCA,CYDC,AdCZiG,AEAY,GJDd,CgBAkB,AhBAlBpG,CgBAmBoU,GhBAnB,EyBAwB,AvBCX,CuBDY,AzBAzBhU,IAAA,IgBAiC,CAAC,ChBAlCA,IAAA,EEC6B,CFD7BJ,GECiC,CAAC2F,AFDlC,EAAAvF,IAAA,CEC0C,GAC3E,CAAC;AyBDL,ArBCO,AoBDP,AjBAA,AaAA,ADAA,ATAA,AgBMAR,E7BNE,AqBCArB,ANAA,AVAA,AeAA,EQDF0b,ADAA9B,ADAI,AhBAJnO,AFCI,AeDJuM,AECI,AvBDA,ASCA,AFDA,AQAA,AlBAA,AyBAA,ALAA,AhBEA,AeFA,AIAJlN,ATAAwE,AhBAI5P,AOCA8J,AEAArE,CPDC,CQCQ4F,AODP,AEAA,AjBAA,AED2BpJ,AWC3B,AdAA,E4BAE,AlBCA,AiBAA,AvBDA,ASCA,AFDA,AQAA,AOAA,ALAA,ADAA,AHCA4Q,AlBDA,ASCA,CoBDCgH,AlBCA5N,AiBAAqN,AvBDApS,ASCA2H,AFDA5B,AQAAoJ,AOAAjK,ALAAF,ADAA0K,AZCA1R,AcAAyQ,CNDCrU,AEAAA,AbEA0H,AFH2B,AGE3B,AyBKA,ChCNC,AID0B7G,AGE1B4H,AyBKA,CDNX,AbCY8I,AlBDA7S,AeAAsD,AdAAA,A+BMA,CFNZ,AVAa,AICAhD,ANAAgE,AODb,ATAA,AgBMawJ,CZNC,ACAA,AGCAjB,CODdlD,ALAA,ATAe,AEAA,ALCA,AMDA,AhBDsB,AKEtB,AcAA,CODfA,AbAgB/B,AEAAA,ADCA,AODhB+B,ATAAA,AhBAgB,CWCC,AWDA,ADAA7I,AdCA,AyBKA,CnBNjB,AaAA6I,AZCkB7I,ARCA,AYDA2E,AXAA,AEAA,AcAA,ASKA,CtBLQ,ANFWzD,CMEV,ACAPiK,AWDAC,AtBAA,AuBCA,CMDC,AhBArBvC,AeCqB,AvBDA,ACEC,ANFD,C+BArB,AdAsB,AEAA,AKCA,ANAA,AXAA,AEAA,CqBDtB,AbAuB/G,AEAAA,AMAvB,ATAA,APCuBnC,AMDA,AdAA,C4BACK,ADCA,AvBDA,AmBCAmX,ANAAnF,AXAArN,AyBKA,CNNxB,ALAyB,ArBAAzF,ASCA,CKAC,AODAiB,ANAAP,AdAAA,CaCCgC,AaDA,CdA3B,AFC4B,ANDA,AsBAA,ALAA,AlBDS,AGET,CFDC,AsBAA,A3BAA,AIDQP,AGER,CFDC,AOAA,AGAA,AdAA,CWAC,AGAAxB,AdAAA,C4BAC,AZAA,AEAA,APAA,AZAAR,C6BACc,AZAA+Q,AEAAA,AfDI,CwBEH,AVAA,EAAEe,AlBDA,CwBCC,EAAE,CVAC,ARCA,AeFA,ANAA,AdAA,CgBAC,AEAA,ALCA,AODA,ANAA1P,AdAAA,CgBAC,AEAA,CDCC,CZCC,CAACqE,AeFA,AHCAsL,CGDCpS,ANAA,AdAA,C4BAC,AdAA,AdAA,C4BAC,GRAG,AHCA,CZCE,AeFD,CHCC,CZCC,CWFC,CAAC,CHCC,CGDC,AHCA,CKDC,CAAC,EAAE,CUAC,CAAC;AEChE,ADCO,AjBAA,AaAA,ADAA,ATDP,ENCE,APAA,ASDA,AQAA,AlBAA,AyBAA,ApBCA,ACCA,AeAA,ASIA2b,EDNFxQ,AFAI,AlBCA,AiBAA,AvBDA,ASCA,AQDA,AhBEA,AeFA,AGCA,ANAA,AFDJ8D,AhBAI7P,AIFiC,AKGjC,EqBASma,AjBAAtM,AaAAqL,ADAAX,AVDPhV,AdAAA,E4BAE,AlBCA,AiBAA,AXDA,AZAA,AcAA,ALCA,AQDA,ADAA,AGCA,AxBDA,C6BACuW,AlBCA5Y,AiBAA8E,AvBDAiB,AFCAhB,AWAAmG,AQDAC,ADAAvJ,AGCAoV,ADCAlU,CjBACiF,AYDAzB,ATAA,AuBKL,ChCNMxH,AgCMLwc,GFLe,AjBAA,AIDPtK,ARCAvH,AuBKL,CtBLMW,AoBAO,AjBAA,ASDP,AtBAA,AQEAV,AeAA5G,ASIL,CrBLM,AiBAA,ANDA,ACED,ASIJ,CVNM,AJCA,CaDjB,APCkB,AxBDAhE,AeAA,AQEA,AtBFA,C4BAC,AlBCAc,AiBAAA,AvBDA,AUAA0C,AdAAA,CECCyC,AkBDA,AHCA,AOAO,CMD3B0D,A5BCqB3D,AGCA,AkBDA,CKDClF,AxBAAmG,ALAA,CqBAC,ArBAA,C0BCQ,ApBCP,AUFxB,AhBAwB,CUCCqE,AcAAyL,CdAC9L,AKDA,AdAA,CUCC,AiBAA,AdAA,AODA,ALA3BtB,ADA2BpI,AdAAA,C8BA3B,ApBEON,AiBDqBA,AXDA,AdCA,AWAA,ARCA,AeFA2V,CPCC,ARCA5N,AmBDO2N,AjBCP/L,CEDC,AmBDA,A1BCA,AKCA1F,AOFA,AdAA,C4BACjE,AZAAK,CPCCmE,ALDA,AUAAnC,AdAAA,CyBCQqT,ALDP,CAACjU,ALAlC,CQC6B,CdAO,AODA,AOCNmK,AhBCM,CSFCjF,AXEA,CIDC,AJCA,AGDb,ADCa,CCDZnC,EgBAe,CdCpB,AiBDqB,AHAA,CdCpB,AiBDqB,AXDA,ARCb,AMDa,AdAA,CgBAC0M,AOCN,AfAP,AMDa,AdAA,C4BAC,AHCA,AjBAblI,CoBDc,AHCA,AFANwN,CHDO,CAAC,GZCV,CAAC,CAAC,EmBAe,CAAC,AXDA,CAAC,EYAE,CAAC,ALCd,CAACE,EHDgB,CAAC,IVEjB,CAAC,AaDO,CbEhDzW,AMH+D,AOCd,CPDe,AOCd,EAAE+W,IbE7C,CAACzV,QaFyD,CbEhD,AaFiD,CbEhD,IAAI,CAAC;AoBF9B,AfAA,AgBMA,CAAC,CFLClC,AjBAAA,AaAAA,ArBDA,ASCA,AFAA2M,AQAAoJ,AlBAA,AyBAAjK,AFAA9L,AzBDA,AOEA,AEDA,AuBKA,EDNF2b,ArBCInS,AmBDA,AlBGA,AiBFA,AzBAA9D,AmBDA,AhBEA,AeFA,AGCA,ARDJ8J,AZFI,AIIA,AOFA,AQEA,AtBFA,CcAC,AdAA,CmBCCuG,AFDgB5Q,AHAhB,AdAA,CmBCA,CSDE,AlBGA,AiBFA,AXDA,AEAA,AGAA,AhBEA,AeFA,AGCA,CKDCsU,AlBGA/T,AiBFAoG,ARAA,AlBAA5G,AoBDA0R,AhBEAjO,AeFAnG,AGCAsJ,CdAC,ANHAzF,CMGCoD,APAA,AKCA,AeAA5G,CpBDCP,C2BACtC,AjBAAA,AaAAA,AxBAAkF,AuBAAlF,AVDAmD,AdAAA,C6BCA,AjBAA,AaAA,ATDC2O,AEAA0D,AjBCAzQ,AuBAD,AVDC,AdAA,C8BAd,A3BFe,AGIA0D,ACAA,CsBDC,AjBAA,AFEA,AeFA,ADAA,AjBCAsB,AOFA,AdAA,CSCC,AMDjB,CeAAV,ArBCkBsB,ANHAtE,COKC,APLD,CyBEE,AFCAyF,ArBCA,AeFA,ALApBzC,CbCqB,AwBAD,ALDC,ADAA5G,CXCC,APAAF,AgBDA,AbEA,CuBFC/B,AlBGA,ACFAmM,AVAA,AyBAA,ApBCAlE,CGDCtD,ACEAvE,AMHA,ALCD,AUDC,AlBFA,AGIA8I,CwBFxB,A5BCyB,AgBDA1I,AjBCAmE,CCAC,ASAA,CgBAC,AXDA3E,AOCA,ARD3B,CNC4B,AkBAA,ANDA,ADAA,AGCA,AjBCA,CGDC,AkBAA,A1BAA,AsBAA,ADCV,CJFW,AZEA0H,AgBAVxE,CMFW,AlBGA,AQHA4D,AjBCA,AmBDA,CQAC3G,AlBGAyB,ERFE,AKCA,CSFC,AdCA,AICA,ACAA,CSFCzB,AMEV,CJFW,AEAA,AdEA,AgBAV,CJFWkR,GEAG,CAAC3Q,EbEE,CGCC,CkBHC,AlBGA,AUHA,AbEA0D,CqBFC,ARAA,CAAC,AEEV,CAAC,CNFW,AEAA,CFACgN,AEAA,CXEC,CAAC,QqBFQ,CAAC,ClBGC,CAAC,AQHA,CFAC,AEAA,CFAC,CAACG,SAAS;AcC5E,AfCO,EaDL,AxBCA,ASCAjG,AQFA,AECA,AxBDA,ASEA,ADAA,AeAA,EQFFoL,ArBCI,AoBAA,AjBAA,AFEA,AeFA,AEAA,AzBAA,ASAA,AQAA,AlBAA,AyBAA,ANDA,AHDuB,AOEvB,AlBCA,CWHwB,CZGtB,AUDOzH,AZHPnJ,AWEA/E,AdAAA,E6BCE,AjBAA,AFEA,AiBFA,AXDA,AZCAsF,AcDA,APCA,AVAAzB,AyBAA,ANDA,AdEA,AEAAsF,CqBDC2B,AjBAA3G,AFEAA,AeFA,AEAAqG,AhBAAS,AeAA9G,ANDA7E,AICA,AzBDAnB,AOEA+G,CGDCkE,AgBAA,ADAA,CtBAC,ADAA,CGAC9D,AcDA,AbEA,CDDA,AcDC4O,AHCO,AhBDP,AeAA,AdAA,C8BAb,ArBCc,ARAC,AcAM,ADDPjU,AdAAA,CSCCoI,AkBAA,AvBAA,AFAA,AICA,CMDC,AFEA,AiBFA,ADAA,ArBCA9C,CyBFhBuC,ApBGiB6B,AiBFA,A1BAAnG,AyBAAhE,CGAC,AlBAA,ARHA,AGIA2I,CGDC,AGAAlJ,ADAAoM,ARHAzG,AKIAuE,AMFA,AdAA,CSCC,AICAoB,ALAD,AMFC,AdAA,CSCC,AoBAA,AhBCD,ARAC,CKCC,ALDC,ACAD,AEAA,CKAC,CiBFvB,CDCyBiN,AnBEA,CCFC,AVAC,AEHD,CSGC,ADAClM,AaAD,ArBHA,CSGClM,AXAA,AmBDA,AICA,CdEC,AUHA,CVGCgK,AUHA,CTCE,CcAA,CAAC,ACAA,ChBEC,AgBFA,ChBECO,AQHA,APCE,CODDsK,IRGI,EEFE,CAAC,CMDC,CWCV,AHAW,CGAV,AXDW,CWCV,AHAW,GZDG,AdAA,EcAErS,AdAAA,C0BCC,AZDA,AdAA,CYCC,APCAuF,ASFA,AdAA,CYCC,EMDE,AQCA,CRDC,AQCAsD,IrBCK,EAAC,CAAC,IqBDI,CAAC,CAAC,CAAC;AIAxE,AFAA,A7BAA,AQEA,EoBDE,AzBAA,AmBAAG,ADDA,AGEAL,ARDA9L,AOEA,EQHF4b,ArBCI,AoBAA,AjBAA,AFEA,AeFA,ArBAA,ASCA,AMDApb,AlBAA,AyBAA,ArBCA,AYHA,AOEA,AlBCA,AEAA,AMFA,AdAA,EkBAE,APCAqM,ARHA5G,E0BGE,AjBAA,AFEA,AeFA,ATDA,AZCA,ASCA,AZDAd,AyBAA,ATFA,AOEA,AlBCA,CuBDC2U,AjBAApZ,AFEAgF,AeFAwS,AZCA3J,AaDA7I,ALAAyG,AGAA+L,AlBCAnQ,AgBCAqP,CXFC,AUAApS,AlBHA,AKIAkF,CGDCnJ,ARHA,CCGC,AeAA,AlBAA,CGAC6F,AeAA7F,AJAAf,AOEAoX,CNHCpF,AfCA7R,AcAD,AZHCwB,AmBKD,CTDE,CHCC,AGDAZ,AZDA,AyBAA,AXAA,AOEA,COFC,AjBAA,AFEAoE,AgBFApE,ALAA,CpBAC,AEHA,AGIA,AEAA,CsBFlB,ALCmB,AJAA,AGAA,ArBHA,C0BGC,AjBAAP,AWCAsL,CbCC,AaDD,AjBAC5D,AEAA,CsBFrBmB,ALCsB7I,ATDA,AQCAA,CDCC,CMDC6Y,AnBEA,CMHC7Y,AZCA,CECC,CFDC,AOAA,AHCA6J,CIDC,ADAA,CmBD5B,AlBC6B1J,AOAA,CMAC,ANAA,AKAA,CCACA,ADAAA,CXCC,CGFC,AHEA,AaDA,CVDCoO,AUCA,GPAG,ERAE,AQAC/N,CNCA,CFDC,CkBAT,AhBCU,CgBDT,AjBAU,CiBAT,AjBAU,AOAC,AOAD,CDAC,AdAA,AaAA,CCAC,AdAA8L,AeAA,AFAA,CRDC,CAAC,AHEA,AMDE,GXCZ,CkBDc,AlBCbxC,IkBDiB,CAAC4B,CVDC,CAAC,ELCE,CAACD,CaAC,CAAC,EbAE,AHCb,CGDc,AeAA,AlBCb,CiBDc,ACAA,CdAC,AaAA,ACAA,CdAC,AcAA,CdACrL,ADAA,AHCb,CAACT,CGDc0M,CHCZ,CAAC,EGDe,CCAC,ADAA,CAAC;AmBA/E,AFDCjK,ArBEAA,EoBCCmJ,AzBAA,AwBDA,ANAAlL,ANDA,AdAA,E8BAFgb,ArBCIhX,AoBAA,AjBAA,AaAA,APDA,AGCA,AhBCA,AkBAAA,ACDA,ATAA,AZHA,AGIA,AEAA,AcCA,CJHC,AfFA,COIqB1E,ANDpB,AcDA,ALEA,AFDA0M,AQAA,AlBAAzH,AgBFA,CWAL,ArBEA,CsBAO,ADFPiU,AhBEO,AFCoB,AeDpB,AECAtN,AXFAiG,AKCA,AhBCA,AmBDA,ATAA,ATCA,AEAA,ADDP3H,AeEO,COFCiP,AjBAAxN,AaAAA,AECD,AzBAClG,ADDA,AoBAAgR,AGAAuB,ATAAzI,ATCAlI,AEAA0C,AcCA,CZDqB,AGApB,AFDA,CgBCC,AdAAsE,AFDAzN,ALCA,CFDC,ACCA,AYHA4R,ChBEE,AICDvL,AiBCA,CZDqB,AJApB,AgBCA1D,CZDqBiH,CDD1B,AmBFR,AZCe,AZCA7D,AmBCP,COFT,ArBCU5B,AODOnC,AOEP+B,ACDO,ATAA,APCA,CFAC0B,CsBHjB6S,AlBGsC,AHDtC,CuBDDhQ,ADCoB,AnBCoBlJ,ARApByF,AGAA,AYHA,AOEApF,ATAA,APCA0J,AcCA,CbFN,ALAO,AFCAxE,AWAA,AZDAP,AoBAA,ADAAtE,AEEA,CbFN,AODO,AZCA,ASCA,AODD,AbApBwJ,AeEqB,COFC7J,AhBCA,AUAP,ANHO,CIECwE,AhBCA6C,AeDA,AGCP,ARDOuH,AOEA,CNHC0C,AfCA,CAAC3R,C6BD1B,AFDC,AhBE0B,AaAA,AdAA,CCAC,AaAA,AvBCA,ASDA,AVAC,AuBAD,AhBCA,CIDC,AaAA,ARFA,AOEAQ,CtBCC,ADDA,C4BAC,ARAA,CQACA,CZFC,AVEhC,CFCiC,AYHAiS,CREN,AODO,CXEC,ACAV,CGDIjI,AHCHjB,CKDW,AYCP,EZDS,AYCP,CdDC,AHCH,CGDI,CeAQ,AlBCV,CKDW,AYCP,ACDO,AlBCVxB,CKDW6E,AYCP8K,CMDQ,CAAC,AzBAA,CAAC,CaFC,AXGV,CWHW7T,AFEd,ATCI,CSDH,CAAC,ATCIwE,CWHW,EAAErD,AOEA,CAAC,GbAG,AMFA,CNEC8G,AMFA,CYEC,CAAC,CNCN,CZDQ,AYCPA,CZDQ,GYCJ,CZDQ,AYCP,CZDQ,CAAC,EYCL,CAAC,AjBAf,CiBAgB,AjBAf;AwBDrD,A/BAA,EUCE,AgBAA,APDA,AQEAD,AHAA,EOFF8P,ADCI,AjBAA/Q,AFAuC,AiBCvCA,AvBDA,AFCArF,ADDA,AoBAA,ADAA5E,AIAA,ATAA,AZFAwF,AGGA,AEAA,CEDwC,CGCtC,AFDAuG,AQAA,AdCAlE,AYHA,AKIA,EOFE,AbDAnI,AQCA,ATAA,CcAC+Y,ALAAnB,ATAAzM,CFCC,AFDA,ASAA,AdCA,CJAC,AWAA8C,AFDA1N,AUAA,ADAAA,AZCA,CNAC8E,AiBDAmQ,AFFA,CSGChK,AJCA,CIDA,ApBAC,CeDC,AfCAxE,AEAA,CQFC,AUEA,ALDA,AJFA,AdAA,AKGA0C,CQFCzJ,AKCA,AhBCA,AYHAoS,AFEA,AZFA1M,AGGA,AgBCA,CjBDC,ACAAU,CwBFlB,ANCmB,CTAC,CcAC,AbDA,CcArBwC,AdAsB3G,AQCAlC,AlBCA,CaDC,AbCA,CuBDCA,AdAA+M,AZFA,AGGA,AEAA,CLHC,CgBECvM,CjBCC,ASDA,ASAA,ClBCC,ASDA,ASAA,CUD5B,AjBE6B,CAAC,AWDA,CXCC,AMDA,AFFA,AOEAL,CKAC,AjBAf,AeCA,ARDe2G,AFFAJ,CYECvG,AjBAf2K,AeCAA,AXFe,CAAC0G,ALCA,EAAE,CSAC,ClBCC,AiBDA,CjBCC,AiBDAiE,ACACjV,AHFD,CNEC,CAACgM,AMFA2F,CDCC,ADCV,CCDW,ADCV,CKAY,ALAX,CSAW,CLAC,AKAA,CKAC,AjBAf,AeCA,ARDe,CUAC,AjBAf,AeCA,APDiB,CRAhB,AeCA,AVHe,CLEdnF,AeCAA,ChBDgB,AQAA,AFFAgF,CNECvG,AQAA4J,EPAb,AeCA,CfDElL,AeCAA,ChBDe,CAAC,ECAZ,AeCA,AHDc,CAAC,CbAC,AMFA,EYEE,AjBAb,AeCA,AhBDakC,AMFA6F,CYEC,EVAE,CRAC,AQAA,CRAC,CAAC,AMFA,CAAC;AaEtE,A/BAA,EUEE,AgBAA5G,APDA2J,AGAA,AEEAoC,AjBDA,AEAA,AMFA,AdAA,E8BAFkE,ADCI,AnBAA,ANCA,AFAA,AWAA,AZDAxa,AyBCA,ATHA,AOEA,ATAA,AZFA4E,AmBIA,CTDC,AIHA,CLEC,AeCA,AdAA,AFDA0G,AQAA,ACAA,AHFA,EYEE,AnBAA,AgBCA,ArBDYpE,AmBAZ,ATAA,CcACsR,AnBAArU,AgBCAA,AFDA2S,ATAA3S,CHAC,AeCA,AhBDA,AQAAsQ,ACAAhV,CRAC2J,AeCAA,AvBAA,AFAA,ASDA5J,AVAA,AEFA,CFECqE,CgBFC5D,CdAC+E,CMGC0E,AGDA,AeCA,AvBAAlE,AFAA,ADDA,AmBAA,CVAC,ATAA3B,AyBCA,ArBDY,AeAZnE,ALAA,CLACqB,AgBCAA,CdDCqI,AeCAA,AVHA,ChBEC,AmBAA,ALAAnK,CUCCsL,AxBDA,AsBEA+L,ANJA,CQGA,ANDC,AIED,CXFE,AeCA,AvBAA,C0BFtB,ADCuB,AJCA,ArBAA,AeDA,AIEA,CnBDC7Q,AcDAyO,AEAA,AjBFA,CMGCxK,ASDAyK,AfFArP,C2BCzBgD,ArBE0BlE,AoBDA3E,AnBAA,AgBCA,AFDA,CdAC+B,ACAA,AeCAA,AXDA,CJAC,AIAA5B,CSAC,CfCC,ACDA,AgBCA,AvBHA,COEE,ANCD,AsBAA,CjBAC,AWDA,AjBFAuF,C2BChC,A1BEiCe,AoBDA,CKAC,AXAA,AEAA,AIAAqP,CKAC3V,CXACgV,AfFA,CQEC,ARFA,COEC,AgBCA,CtBAC,AODA,AeCA,AFDA,CAACvT,EdAE,AKAA,CLACuI,ACAA,AIAA,CXCC,AcDA,APAAsC,EOAE,CRAC,CAAC9M,CmBAC,CAAC,AnBAC,EAAC,AKAA,CLAC,AcAA,ATAA,CSAC,GbAG,CAAC8L,IAAI,CAAC,IAAI,CkBAC,AlBAA,CkBAC,AlBAA,OaAO,CAAC;AMC7E,A/BDA,EGEE,AWAA,AaAA,ALAA4K,AlBHA,AGIA,AEAA,AMHAzT,AdAA,CGDC,C2BEH4Y,ArBCI,AoBDA,AjBAA,AFAA,AeCA,APDA,APAA,AVAA,AsBEA,ACFA,ATAA,AOEA,CVFC,ADAA,AGDA5Y,CFCC,AeCA,AvBAA,AODA,AMFAqP,AHCAxR,ELEE,AoBDA,AnBAA2K,AeCA,ATFA,AGCA,AdDsBlE,AeCtB,AGEA,ACFA,ATAA,CNCCvC,AoBDA6U,AJCA9B,AFCAN,ACFAU,ATAA3I,ADDA,AdAAvM,C2BEC,A1BDApC,AoBCA6V,CMAChL,ANAA8K,APFqB,AQGrBtE,ClBDCnL,AgBDA,ApBDA9D,C8BCZ,ArBCa,AWDAlC,AHFA,AjBCAD,CmBCCiV,AFFAhP,CRGC,ARDA,AKEAQ,AEAArG,CsBFfgI,ApBAgB,AWCA,ArBFA,CoBCC,CnBAC,AoBCA,ADDA,AGEA,AvBHqB,CyBEpB,AEAA,AvBAA,AgBDA,AGEAwN,CEDC9V,AEAA4J,CjBDC,AOFA,CbGCxD,AHDA9B,AcAA,CeAtB,AbFuB7D,CUGC,CjBDC,AKAA,APEAH,CqBFC,AFCA6J,ARDA,AbEAxD,AEAD,CEFE,AaEA,AjBAAM,CiBACmP,ANJA,ATIA,CqBFC3W,AVAAwV,AFFA,AOEA,ATAA,CAACtQ,CYCC,AvBAA,AECA,AgBAX,CKDY,AvBAAmB,AoBDA,AFEXsO,CrBFY,AKEA,CLFCpQ,EwBCE,ArBAA,AoBDA,CKAC,AJCA,ArBAA,AoBDAuR,ATAA,CcAC3V,AdAAyB,EIAE,CfCC,AeDAA,AGEX,ClBDYqE,AmBCR,ACFQ,AFEX,CrBFY,AsBER4Q,ACFQjV,CCCC,CxBDC,CwBCC,AHCX,CAACsB,ClBDY,EqBAE,ArBAA,CqBACvC,AFCR,ARFQ,CcAC,ANER,ARFQ,CcAC,ANER,ADAH,ClBDY,AeDA,AIER,ADAH,CGDY,ArBAAwF,AeDA,AGEX,CGDYsF,ADDA,CAClD,AFCyCoJ,GGDa,CAAC,EHCR,EGDY,ArBAA,CqBAC,ArBAAjO,CqBAC,AHCT,GPFY,CAAC,EXCE,CAAC,CyBDC,CAAC,EVAE,CAAC,GKE3E,CAAC;AMHL,A/BCA,AIDA,ESEE,AVEA,AWAA,AFFA,AeEA8E,AHAA,EMFE,AJCArH,AEAA,ATDA,AGCA,AJHA,AOIA,ATFA,ATEA,AEAA,AMJ4B,AdAO,C2BGlC,ClBACM,ACDA,AiBCA,AvBCA+B,AHFAjC,AIFoC,AeEpC,AEEAkS,CjBJqC,CwBEnC,AbDAnF,AHGAxD,AMFA,AECA,AhBHoC,AmBIpC,ATFA,ADFGnL,AdAOA,C6BET4W,A3BEAnU,AmBDA6Q,AGCA4B,ATFA3I,CNCC,ACDA,AQAAlK,AVEA,CEFCA,AJEA,CaFCwQ,AlBAA,AyBEAhK,AJAA,CbDC,ALCA,AsBAD,AJACmJ,CbDC,ALCAhO,AHFAlC,AoBCA,AbCA,CCDC,AiBCA,AlBAAsD,CiBDN,ATFO,CSEN3D,ATFOmN,AECA,AGCA0E,AfCA,CIFC,AGEAnI,AZFA,CSAClM,AGED,ASAC,CJFC9B,AHAA,ADFG,AdAO,CIIT,AFAAsF,AWAA,APAA,CJACJ,ADFA,AoBCA,AfCA8B,AgBAA6N,CGDN,ATFO,AfCA,AcAA,APEA,AMJA3T,AdAOA,CyBGb,ATFO,AZGCV,AeFD,AlBAA,AKEA,AEAA,CQHC,AVGA0G,CuBFC,AVAA,CJAC,CLAC,AQAA,AMEA,ATFAhC,AOEA,COFClF,AnBAA+B,ANEC,AFAD,AgBFA5B,EhBEE,AsBAA,CdFC,AIFT,AdAO,CUEG,ANEEsG,AIAF,AMJVrH,AdAOA,EwBIK,ATFA,APEA,CgBAC0W,ATFAlU,ATEA,AEAA,CqBFC,AvBEA,CuBFCzB,AJCP,CrBCU,AUJlB,AdAO,CyBGG,ArBCSK,CoBAD,AlBAA,CkBACoB,AlBAA2F,CIFC,AQAA,AVEA,CEFC,AeCP,APDO2N,AVEA,CiBDN7H,ArBCS,AIAF,CJAGvG,CUJzB5F,AdAOA,EeEmB,CAAC,CTEC,CuBFC,AzBEE,CyBFD,AzBEEF,AcFF,AZEAwG,CYFC,CMEC,CACjD,AVLiB,AdAO,CMI2B,CFAG,AEAF,CFAG,IqBDL,CAACiE,AXHlC3I,AdAOA,CeEmC,CAAC,EUCL,CAAC,IAAI,AXH3C,AdAO,CyBGqC,CIDQ,AJCP,CIDQ,AfFrD5B,AdAOA,IwBM1B,CAAC,IVNkB,AdAO,McAJ,AdAO,IcAH,AdAO;ADErC,EaEEoK,AaAA,AEAA,AhBAAgB,AYEAX,ANLA,AXIA,AEAA,ECDE,AoBDA,A3BEAzG,AgBFA,ALEA,AaAA,ALDA,AhBHA,AeEA,AIIA,ATJA,ADFA,AdAA,CoBEC,CVAC,ANEAwB,AHFA5B,AmBAA,AEEAzC,EOFE,AbDArC,AECA,AQEA,ALDA,AGGA,ATJA,ADFA,AdAA,C6BEC0Z,AXAAxU,AQEAA,ALDAqG,AEEAI,ACCAyL,ATJA/H,CFEC3I,AMFA,AIGAlC,CrBDC,CAACe,CEAC,AHFA,CGECwB,AeFA,CAAC4O,AlBAA,AoBCA,CLFC,AECA,AQEA,ALDA,CLFCjE,AHGA,AFDApF,AeCAxK,ALDA,AEEA,CLHC,APCAuK,AaGA,CvBJC,AsBGA,CXFCf,ACCA,AZFC,CWCD,AYGC,CbHC,CCAC,CVCC,ASDA,AIDA,AOEV,COFW,A3BEA,AiBFA,AKIA4L,AFFV5U,CTAW0H,AMFA0L,AOEA,CAACvT,AXFAnC,CcACA,AbDA,AMGV,CNHW,AZGA,AkBAV,GlBAcQ,CsBAA,CAAC,CVHC,AdGA,AaFA,CcAC,AbDA,AHGN,AEFML,CcACA,AzBEC,AFAD,AWANwJ,ASAJ,CHFW,CAAC,AGEVgN,ElBAc,AsBAF,CAAC,CbAL,CAAC,CAAC,ASAJ,CAAC9B,CpBAW,AsBEZ,CtBFa,AsBEZ,ETJc,CcAC,AdAA,CcAC,APEV,CAAC,OEEK,EAAExS,KTJiB,CAAC,IcAI,CAAC,OLIf,CAACoB,QAAQ,CAAC,CAAC,CAAC;AMJtE,A/BAA,E0BGE9C,AEAA0K,ADAA,ALDA,AhBHA,AeEA,AHDA,AXIA,AEAA,ECFE,AoBDAd,AjBCAlG,AFDA,AREA,AWCAqC,AFFA,AVDA,AsBGA,ACCA,ATJA,CdAC,CwBEC/F,APFAI,AjBAA,AaFA,AQIAsD,AtBJA,CyBIA,ChBDE,ALCA,AODA,AQDA,AIGA,ANJA+N,AOKA,ATJA,ATGAlL,CGFCvC,AgBCA,AdDAuH,AYEAkL,ACCA9L,ATJAgE,CYECjE,CAACX,AzBAA,AWCA,CAACpD,ACLA/E,AdAAA,CSGC,ASDA,CTCCmI,ALCA1D,AcFAhG,ChBEC,AMCA+G,CIFN,AeCO,AvBAA,CQDNzD,AEHO,AdAA,C2BIC,AJCA,ADDP,CbDQ,ALCA9D,AcFA,AKGA4V,AjBAAlP,AgBDPxC,CJFQ,APCA,ALEA8C,AEAAO,AMLAtF,AdAAA,CSGC,AIEA,AEHA,APGD,EIFJ,ADAO4J,AMFA+F,ATIA,AcDP,CVDC,ARCO,ASCA,AIJA5O,AFCAxD,ATGA,AgBDP,ClBAQ8G,CECC,CKFC,AMFA,AOKA,CAAC,CPLCnC,AOKA,EpBFE,AmBCA,CMHd,AzBEesC,AWFA,ADFA,AdAA,C6BEd6D,AZDe,AFCA3K,ADFA4C,AdAAA,CuBKCyB,CNJC,CJIC,CDFN,CRCQ,AkBAP,CVDC,AMDO,CAAC,AJFA,AQIPmS,AtBJO,CuBKC,ATLAlW,AdAAA,EYGL,CAACwM,AEHO,AdAA,CcAC,AdAA,CsBIN,COFP,AdAe,AOEP4H,COFP,AdAe,CcAd,CAAC7H,GPEW,COFP,APEQ,COFN7C,IAAI,EjBCS,CAACsB,CiBDL,AdAa,CAAC,EHCL,CAAC,IAAI,CAAC,CAAC;AkBD3D,AJGP,A3BHA,EGGE,ASDA,AUCA6K,AhBHA,AeEA3V,ERAE0D,AFDA,AeEAsS,AEAA,A1BFArW,AsBGA,ANJA,AOKA,ATJA,ATGA,AEAA,AcDA,CAAC,CQHQmb,ArBEP9W,AoBDA,AXAA,ALGA,AMHA,ACCAhE,ANHA,AQIA,AtBJA,CoBGA,CVDE,AiBEA,AXHA,AZGA,AaHA,AOKA,ATJA,CeDQ,ApBCP0K,AiBEAnG,AtBHAkD,AeEA,AHFA0J,AOKAkG,ATJAzI,CeDQ,ArBEP,AoBDA,AhBGA5K,AZHA,AOGAkF,CCFCa,AoBDAP,A5BAApF,AsBGA,AjBAA,EeDEuR,APJA/T,AdAAA,CIIC2E,ASCA,AQDAkE,CQFC,ANGA,CdFC,AGAP,AeCO,AJCAgM,CXFN9S,AFDO,AiBEAzC,AdCA6E,APAA,CuBHCyD,AnBAA,AeER,AXJQ,AdAA,CSGC,ACDA,AeERyM,EDEU,AlBDA,CuBHC,AREA,AGEA,AlBDApX,CMFN,AaCD,ADEQ,AVNA,AdAA,CYGN,AaCD,AZCQ,AZHA,AoBEA,AJHA,CQGP,ArBAQ,ASCAyH,AZHAzG,AsBGA,CEDPwM,ApBHQ5E,AkBIA,ClBJCC,AkBIA,ANJA,AHDA,AdAA,C2BIC,AvBAA7H,AWFA,CNCC,CgBCP,AxBFQ,AaFAZ,AdAAA,CyBIP,AEAQ8K,AdCA,AZHA,AgBDA4H,AFCA,EXEE,AECA,CFDCnL,ACHA,ACIAD,AEAb,AMLa,AdAA,CeEC4G,APGb/F,AMLa/E,AdAAA,C2BIC,AtBHA,COEN,AaCD,EbDG,CeCQ,AnBCb,AMLa,AdAA,CQKZ,AMLaT,AdAAA,CQKZ,CIFO,CAAC2K,AeCO,CAACsL,ArBCA,CWJC,AXIAhR,AQLA,AdAA,CIIC,AaHA,AHDA,AdAA,CIICN,AaHA,EXIE,AQLArE,AdAAA,CMKC,MqBDM,EvBAE,EQDL,CAAC4I,AEHO,AdAA,IYGH,CAAC,IAAI,CAAC,CAAC,EGDZ,CAAC,CAAC;AbGxD,AwBDCrJ,A3BFD,E+BAE,AHGA,AhBAAmK,AVFA,AsBGA,ACCA,AlBDA,AgBDA,EbDE,AGAAlI,AFDA,AQAA,ACAA,AEEAtD,AhBHA,AeEA,AHFA,AFCA,APGA,AMLA,AdAA,CmBEC,ALFA,AdAA,C6BEC,AJEAwJ,ANFA,ALFA,AdAA,C0BGL,ChBDO,AMDAvK,AZGA,AsBDPqY,ANAO,ALDA,CeDCqD,ApBCApQ,AUCAyK,ALDAvG,CcAC,AZDA,ATIA,CqBHCjE,AREA,CSHCmQ,A1BGA,AiBAAla,CSHA,A1BGC2E,AUJAxD,AdAAA,CcAC,AdAA,C8BCC,AtBIA,CIFN,AIFO,ALGA4J,AHCAxE,AMLA,AdAA,C6BEC,AjBCPzD,AIFOrE,ALGA0C,AeDhB,ALCgB,CQFC,AlBEA,AUAC,ANFD,CcAC,ATCA,CTCC,AeDnB0V,ANAmB,CJFC,AIEA,ALDArY,APGA,CQJC2R,ARIA,CIFN,ARCO,AICA,CIFN,ARCOvK,GMFG,CAAC,AWEAgE,CXFC,AgBC5B,AXD4B,CAACjL,CXEC,CAAC6G,CYHC,CSGd,ATHewK,AZGA,CqBAd1G,CrBAgB5D,AiBAC,ETDN,ASCO,CAAC,CTDN,EIFS,CAAC,CJEN,AGDO,CHCNiG,AGDO,EXEE,EqBAb,ArBAe3M,CqBAd,CAAC,CAACwM,ErBAiB,CAAC3F,CqBAd,CAAE8C,AVFc,CAAC,GUEX,EbDS,CAACsB,CaCL,ArBAa,CAAC,EQDL,CAAC,IAAI,CAAC,CAAC;AVCnErJ,ADDD,ESAE,AiBGAgO,ARHA,ACCA,AGGAmG,ACCAjL,AlBDA,AEDA,AcAA,EQJE/L,ArBEA,AoBDA,AjBCA8E,ADCA1B,AUAA,AhBHA0F,AUCA,CcAC,AlBEA,CkBFC,AzBEA,ASCA,AFDAqE,AMJM6F,AHANxR,AdAAA,C2BKCqP,AvBDA,AFDN,COAO,AgBCA,AECD,AzBFNpL,AmBCO,ANFA,ATIAmE,CGHCxE,AYCAyG,ANFAqE,AOGA3H,CKAC,CzBFT,AGFU,CoBGC,ApBHAG,CIEC,AgBCAoF,AFEAkJ,ATNA,AdAA,CSGC5S,APAbqB,AqBGY,AjBACmE,AQNAnI,AdAAA,CMMA,AgBDC8G,CVFN,AWGO,ADDD,CVFLxD,AVAT,AmBCgB,AfEA,CgBDC,CbFC,AKHA,AdAA,CWIC,AUAA8G,AhBHA,AmBMAE,ATLA,ADFA,AdAA,CSGC,AECA,ANHAhD,AmBMD,CbHE,CCDN,AYIO,ATLAtI,CHCN,ISCW,GIAG,AVFA,CUECmK,AVFAhK,EeDd,CAACU,CLGiB,CbDN,AaCO,CpBHC,COEN,APFO,IOEH,CAACuM,CkBFR,CAAC,AzBAgB,AUCA,CeDf,AfCgB,CVDC,KSDK,AdAA,EcAEzK,AdAAA,CcAC,AdAA,CcAC,AdAA,IYGH,AGDO,CHCN8I,AGDO,IHCH,CAAC,IAAI,CAAC,CAAC;AXDjErJ,AFAM,EWELmJ,ACCA,AQDAoK,ACCAjV,AZEA,EsBLE,ADCA,AjBCA2D,AeEA,ATHA,AGEA,AEEA,ANPe,AOQf,ATLA,ATIA,AgBDA,CLNgB,CRIdM,ALCA+B,ASCA,ARJA6B,AeGA7H,ArBHOnB,AeDP,AdAA,CCCL,AmBGK,CSFE,AnBCAgM,AeCA,ATHA,AfAPlH,AoBGO,AJLe,AOQf,ATLA,CcACiH,AnBCD,AWCCC,ADAA,AIGAoM,CMNCgE,ArBEA,AkBEAlD,AdAAvK,APCAzN,CGHCkD,ACAA,AaGA,ADDAgT,CZFC,AeCA,ANDAhB,AFJe,AFGf,CeDC,ALGAI,ArBAA,AeDAH,AlBFZ,AIAY,AYFe9D,AFGf5C,ATIA,AQNArM,AdAAA,CIICyE,CiBAC,AhBHA,AkBKA,AfAA1E,CsBLC,ArBEA,AGAP,AXFRyB,AoBGe,AEEA+S,AjBAA,CMHN9S,AOAO,AECA,AGGA,AFFA,CKAC,AdAA,AWEA/D,AhBDAqC,AcDAiS,CbFCxS,AUAA,AdFA,AGKA1C,CsBLC8b,A/BAO,C4BINzb,AdAAJ,AZJpB,AcCoB,AhBDO,ASKP,COJCgD,ATIA,CwBLC,AlBEP,AaCO,ArBAA,AIEA,CsBLC,AlBEP,AaCO,AHCA,CQJC,ALGA,AZCA,AUCA,ARJA,ADFA,AdAA,CIIEpC,ASCDX,AUCAuL,ARJA,ATIA,CuBJC,AvBIA5L,CuBJC,AZHe,CYGd,AFGA,CAACkZ,CvBDE,GmBEE,ACCA,CpBHG,ASCF,AWEA,CXFC/T,CJFT,CAAClB,AGAG,ANGO,CAACuD,CMHN,ACEO,CWEC,AlBDA,CODC,APCAjF,CqBDC,AdAA,AWEA,CZJN,ACEO,CDFNsL,AGDO,ATIA,CGHT,AMDU,ATIA,CGHT,CAAC,AkBEU,CHEC,ClBDC,CSJC,ATIA7N,CqBDC,CAAC0F,EZHE,EAAE,GYGG,ErBCE,CMHN,ANGOqC,CMHNkE,IAAI,CAAC,GNGU,CMHN,CAAC,ANGO,CMHN,GNGU,CAAC;EuBH7E,AjBCA,AFCAH,ACCAkB,AUDA,AEEA,AxBLAhN,AuBIA,EQJE,ArBEA,AkBEA,ATHA,ACCAoW,ACCA,AHLA,AXOA,AEAA,AMNA,AdAA,EyBIE,ApBHApN,AmBMA,ATLA,CUEC,CAAC,AECA,AXJAoJ,AZGA,AeDA,ACCA,AdEA,CqBDC6G,ARFA3W,ACCAkU,AdEA,CYJC5V,ADHA+R,AFGA,APIAhI,CsBLCwR,AfCAzW,CXEC,AOCAsH,AaEAjK,CRNC,AZGA6D,AOCAiG,AZJA7M,AOKA,CwBLC,AdAA,AjBAAC,AOKAE,AEAA,EFAE,CqBDC,ATHA,APGA,AaEA,AhBDA,CWHC,AFJA,AFGA,ATIA,CqBDC,AhBAA,AQFAmQ,AdFA,AeGA,ALFAhO,CLECwJ,AQFApG,AEEA,AIGA,CdHA,ALHC,AeGA,AHLA,AlBEA,EWGE,AXHAxF,ASKA,CgBCC,CpBHC,AeDA,AKIAiY,CLJC,CDDC,ADHAnF,AlBEA,CKGChS,AcFA+Q,AHAA,APIA,COJCxP,AhBDA,ASKAa,GSPG,AFGA,APIA,CJFC,AaLAY,AOQA,ATLA,APIA7D,CJFCmH,AeDA,AKIAvE,CLJC,AXGA,CSPC,ATOA,CUJC,CDHC,COQC,CRNC,AZGA,AoBGAkO,CRNC,AZGAxJ,GoBGG,ATLA,CSKC,ATLA,CSKC,CpBHC;AmBG/C,EOLE,ADEAsE,AjBCA,ASCAgL,ADDA,ANJA,AQMA,AtBNA,ESGE,ACCA,AeAA,AdCA,AQFAX,AdFA,AUCA,AhBDA,C0BGC,ApBHA,CoBGC,AECA,AXJA,AHIA,ARJA,AYFArD,AOQAlQ,AlBDA,EuBHEkJ,AjBCAK,AFAA,ANAApF,AOCA6F,AQFA,CUAA,AnBCCnH,ASDApD,AGGA+U,CbHC1M,AkBEA,A5BJAxK,AOKA,CuBHC,AFEAuF,ArBCAvF,CKDC,AMNA,AlBEA,CsBIC4W,AfCA,CGHC,AYED,CjBDE,ALHAvX,CWGC,ANAA,AiBCA,AfCAyB,CGHC,ACCAF,ACCA,AWCAsW,CVFCjL,AeCA,ARFA,AGGD,CVFExH,AeCAgM,ARFAN,AbGA,CFFC,AkBEA,ClBFC1J,AOCA,CAAC8F,CFFC,CkBEC,AHEV,CZHW,AeCA,ARFA,AKIV3I,AzBNU,C4BIC,ARFA,ApBFA3D,CUECoK,AGCA,GbHG,CyBMT,AzBNUnK,CyBMT0C,CdHW,ANAA,AOCA,CDDC,ANAA,COCC,AQFA,CAAC,CVAL,AeIJ,CfJKoC,AeIJ,EzBNY,CAAClF,CUEL,CAAC,CAAC0J,CCCO,EAAE,CXHC,CAAC,CUEL,AVFM,CUEL,ACCM,CDDL,ACCMqC,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AaE1ErJ,EOHC5C,ALEA,ANDA,ACEAuW,EXFE1T,AoBAA,AjBCA,AFAA,AiBCA,AXJA,AECA,AGGA,AhBJA,AmBMA,ATLA,AhBDA,AOKA,AEAA,AcAA,CNLC,AQMA,CRNC,AZGA,ASCA,AFAA,AMNAoQ,AOQA,CpBHC,AmBCN,CbDO,AaCPyE,ARHO,AhBDA,CWGChS,AKFAoG,AhBDA5L,CaGC6K,ACCA4D,AFAAxB,CUAC,ACCAgK,CFDCZ,AHNA,CaGCvW,AVGD,ArBJC,C+BCA,AjBGC,AINA,CIMC,ADAA,CUHC,ApBEA,AWCA4L,AtBJA1L,CWGCa,AGCA,ASCA,CCDhB,ADCiBsU,ELPE,AlBEA,CcICzG,AFAA,AYApB8I,CdFW,CAAC/S,CEEWkI,AUAA,ACCA,CTDC,ASCA/C,CTDC,CAAC4E,AEHA,CJGC,AIHA,AOIA,CXDCtB,AIHA,AOICjJ,ECD7B,EbDgC,CAAC,AYEC,CTDA,CAAC,EDDb,ACCe,AFAA,AWCEA,CbHX,AGCLQ,CHDMgG,GaGe,CbHX,ACCU,AYEEjB,CbHXvJ,CCCW,CDDT,CAAC,AaGY,CAAC,CZFD,CAAC+L,IEAX,CAACtH,KFAoB,CEAd,AFAeqH,CEAd,GFAkB,CAAC,IAAI,CAAC,CAAC;ASAzE,AXGA,EIFE,AaCA4B,AEAA,AXJA,AKIA,ANHA,ADFA,AQMA,AtBNA,E8BEE,ArBCAhJ,AoBAA,AnBCA,ANAA,AcFA,AbDA,AeIA,AIEA,AzBNA,AOKA,CFFC,CAAC,AOCAgI,AMNAqG,EaGE,ADCA,AnBCA,AGAgChT,AOChC,AIEA,AzBNA,C+BCCkc,ADCA9C,AnBCA5T,AUCA4Q,AIEA+B,AzBNA/X,CmBCCqO,APGA,ANJA1F,CMICmE,ALCA,COFiC,CIL/B,CCGC,ALEgC,AOChC,ArBJA,CqBIC9K,AHNA,AXOA,CwBJC,ArBCP,ACCO,CDDN4C,ACCOnE,AQFA,AnBDC,E+BCC,CDCC,AJEA8M,AdAA,CFFN,AoBAOkE,AJEApH,APHAiE,CTCN,AJFO,CyBCCa,AnBGA,CSAC,CKAC,APHA,AbDA5G,AeIAtG,CFHC,AMKA,CCFC,APHA3B,APGA,AaEAG,CbFC2L,ASAA,CAAC,CSFC,ExBFE,CwBEC,AnBCA,ALHAjE,ANAAtI,CWGC,AQFA,CTCN,AoBAO,AXDA,AEGA,ArBJC,CqBIA,CXFNwK,ASDO,AnBDA,E+BCP,AnBGS,CmBHR,AnBGSyC,CmBHR,ArBCE,ACCO,ALHA,CIEN,AJFOtE,CKGC,AcGA,CAAC,GdHG,CAACqD,CCCC,CaEC,EAAE,GdHG,CAACF,EcGE,CnBNC,CKGC,ALHA,CKGC,IAAI,CAAC,CAAC,QLHQ,EAAE;AWC7E,AGCCrJ,AXID,EIDE6K,AeCA3B,AvBFA,AiBEAC,ADDA,ALFAA,ATGA,AQNApJ,AQOA,AtBPA,E8BEE,ArBCAkC,AoBAA,AnBCA,AeCA,A1BJA,EmBAmC3E,ALE0B,AFE3D,ANJA6I,AmBMAlG,CXJ4D,AMDjE,CWAO,ApBEA,AeCA,AZF2D,AMDlE+S,AEIO7J,AJRS,AFKTA,AhBFA,AeDApJ,CgBEC0Z,ApBEA3W,AeCAkS,AJCD,ANHA,AhBFCrX,AeDAU,AQOAqW,AtBPA3U,CkBCkC,APIjC,CAAC+J,AUCA,ANHA,CGFkC,AJDjC,CTCC,CSDC,CTCC,ALDA/J,CSGN,ACCO,AVJA1B,C8BEC,ArBCPiE,ACEH9C,CeAW,A1BJA,CaICqL,APJA,ALDA,C8BEC,AlBGA9C,AeCAmB,ARJnB,CVCa,AgBEO,AECD,A5BLCtL,ACDA,CSGN,AEEO,AMPS,CUQR,AhBDA4M,AQHtBwI,CWAuBiE,AlBGA,AKPS,AOSnB,AFAUvC,CGFCI,ADEVrT,AFAUqF,CVFC,GbJG,AuBMA,CZFT,AXJUjJ,CWIT,AYEU,CXFC,EZJE,CYIC0M,AQHlC,CVC4B,EAAExC,EeID,CAAC,CMLC,ArBCG,CqBDF,ArBCG,CqBDF,CNKC,CbFW,AaEV0N,CCFD,CAAC,EfAI,CAAC,CAClCtX,WcC8C,CAACgC,CCFD,EAAE4H,CfChC,CAAC,AcCmC,CAACsG,CCFD,CAAC9M,EDEI,CAAC,CdDlC,AcCmC,CCFD,ADEE,CdDlC,AeDiC,IfC7B,CAACkH,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;AML3DrJ,ARMD,EEAE,ANDA,AgBCA4T,AdCA,EwBLE,ArBCA,AoBAA,AjBEA,AaAA,AECA3R,ATNqD,AGMrD,AGCA,ATJA,AhBFA,AeDA,AQOA,AtBPA,CkBAsD,AMOrD,CNPsD,ALGrD,AFEAtD,ANJAyH,AYJ8C,AOU9C,CRPL,ACHoD,CaK7C,ADCA,AjBEA,AaAA,ATLP2I,AZKOjK,AiBCA,ANHA,AhBFA,AOMAkC,AQPA,AdAA,C8BEC0S,ADCA3R,AjBEAmD,AaAA8J,AJCArX,ANHAoL,AhBFAjL,CcECsD,CJAC2G,AaIAwM,CFDCX,AdCA5M,CuBJC,AhBAA,AFEA,ASCD,AdCA,CKFE5H,CFFC,AoBAA0I,ATGA,AdCA,CqBDN,AdHO7G,CcGNiB,AZHO,AhBFA,AuBMA,CQLC,ALGA,ATLjB,AKMiB,ANHAiH,AOIAsJ,CVFC,AaAAlJ,ArBAAzE,ASFA,AFEA,AUCA0F,AhBLA,COICzC,ARAA5C,ASFA8G,AFEA,AZJArO,C+BCC,AdFpBmR,AXCoB,EsBKL,CfDQ,AeCP,AZHO,AOIA,CQLCU,AfCA,AOIAkF,COJC,AjBEA,AaAA,AVFA,CcAC,AJEA,CIFC,ARGA,AtBLA,CKIC,ALJA5W,AuBMA,COJC6M,AjBEA,ADAA,AWECrJ,CVFA,AIL9B,AZK8B6D,AOAA,AUCA,EIDG7D,AJCD,CQHC,ARGA,CQHE+F,AzBED,ASFA,AQGA,ACCC,CTJAyE,CcGN,AvBDO,CqBAE,CECP,ALCSxK,CTJD,CAAC,CYEG,CIFA,AFGR,A5BLO,C4BKNuJ,A5BLO,AuBME,CQLZ,ARKahE,CQLZ,CAAC,ADCa,EPIE,KAAKA,IAAI,CAAC,EKDP,CAACuC,IAAI,CAAC,A5BLO,CAAC,CAACrL,E4BKL,CAAC,CAAC,G5BLU;ASM5E,ECHE,AGEA,AFEAoL,AKJA,AOIA,EQLE,AHIAnH,AvBDA,AOAA,AUCA,AhBLA,AeKA,AICA,AzBNA,AOMA,CDNC,CwBECqF,AJEAS,AZDA,ARHA,AYJAlK,AHGAwC,AdAAA,E8BEE,AVIA,AICA,AzBNA,C+BCCsZ,AVIAjG,AICAgC,AzBNAzX,C0BIC,AZDAiO,AQEAkI,AJTA,CQQC7S,ArBAA,ASDA,APGA,CeDC,AJTA/D,CPUC4L,CmBJC,AnBID,AGHCxL,AOEA,CSHCoM,AzBEA,AiBCApM,ADAA8B,CVCC,AeFA,AECP,AvBDOsE,AaRA,CUSN9B,AVTOzE,AXUA,CQPC,AdAA,CyBKC8D,AXLAV,AdAAA,EMOE,CuBJC,AhBCA,APGAzD,CwBLC,ADCCC,AFGR,AdFO8O,AQEA,CIDC,AECP,ANAOA,ADAA,CAACpM,CUJC,AbLA,CAACwC,CbQC,ALJA,CKKrBuC,AoBCsB,AzBNA,AeDA,AdAA,C8BECuQ,ADCC,ALIDlX,AzBNA,AeDAE,AdAAA,CoBMC,AHTA,CGSC,CdCC,AQPA,AdAA,C6BGG,AvBIFuG,AQPA,AdAA,EaIE,APGA,COHC,AQEA,AfCAY,CqBDN,ANAO,ADAA,CAAC,COAN,AvBAf,ASFsB,APGA,CFDrB,ASFsB,APGA,CFDrBL,AiBAsB,CAAC,CMAN,CAAC8F,ArBCO,CkBAC,AlBAA7N,CkBAC,IpBDlB,CAAC,CoBCuB,CpBDrBgI,CoBCuB,ElBAE,CFDrB,AECsBD,CFDrB,C0BJO,A1BKrCE,C0BLsC,ANKgB,CMLf,CHIU,CAACgE,GrBCU,CqBDN,CAAC,ArBCO,EFAnD,CAAClE,CuBD+C,ArBCO,CqBDN,ArBCO,CqBDN,MvBCxC,CAAC;AIA7B,AcCA,EbHE,AGEA2F,ARCA,AOFA,ASCA,ALFA5B,AhBHA,AOMA,EwBLE,ApBKA,AiBDA,ATNA,AGMAkL,AhBLA/N,AYJA,AHGA,AdAA,CiBHC,AHGA,AdAA,CyBKC,AZDA6F,AQEA,AJTA,AOUA,AVPA,AdAA,CaIC,AQEAxM,CSJC,ADCA,AnBIA,AiBDA,AdFAwB,CiBFC0Y,ApBKA9W,AiBDAA,GEHG,AJEAiF,AZDA,AWGA5H,CKJCoX,AfHAhX,AdAAA,CcAC,AdAA,CSICgI,AIAAnH,CHGC,AeFA,AECA,ANAA,AhBLA,ASDA,AdAA,CUOC1B,AeFAsH,AECA7I,ANAAwB,AhBLA2G,AmBMA,CXHC,CDECwE,CAAC/C,ASAA,AGCA,ATHAmB,CUCC,AJCA,ANFD,CUCE,CAAC,AVDA,CHEC,AYCA,CAACwM,CZDC,AFCA,CoBLC,ApBKA/V,AWDA,CAAC,AhBLA,CwBEC,AxBFA,CyBCC,ADCAtC,AnBIA,CAAC,CDHCkL,CAACC,AkBEA,CGJCwN,AHIA,GEHG,CAAC,AnBIA,ALNA,CKMC,CiBDC,AtBLA,EIGE,AkBEA,ElBFE,CeGC,CGDC,AHCA7V,CGDCoW,CtBLC,EAAE,CmBMC,CAAClI,IAAI,CGDC,AHCA,CGDChF,AHCA,IGDI,CAAC,IAAI,CAAC,CAAC,GGJjB,CAAC,CAAC;AVKtD,AZAA,AcACrJ,EZCC,ANCA,AOFAqK,AZJApM,AOMA,EwBNE,ArBEA,AGEA,AaDA,AECA,ATNA,AGMA,AJRA,AFMAgE,CUCC,CIFC,AJEA,AZDAiK,ARJ8C3F,AmBO9C,AVPA5H,AdAAA,C6BGC,AhBCA,ASEN,CQJO,ADCA,AjBGA,AeAA,AvBEAgB,ASJAyM,AQEA,AJRA,AXUA3G,AgBFP8O,CQJQsF,AHIA/W,ANAAiR,AJRAhE,CRMC1S,ASJA6O,AMOA/L,CpBCCR,AcRA,CNMC,AREAwF,ACR8C,COM7C4C,AENA,AdAA,CkBACnK,AGMA,AhBN8C,ACQ9C6H,AQRA7G,AQMb,AtBNaA,CWMCyL,AUAAL,AGCA,AlBCD,CqBFE,AdFA,AFED,AIFN,CNAQ,AGEA,AeAA7L,AVRA,AFMP+D,ATIO,AgBFhBqS,CXAiB,AMRAhE,CLQChT,ACFA,ACJA,AdAA,CSIC,AQNA,AOSA,AVPA,AdAA,CYMC,AREA,ALNAU,CmBFC,AGMA,AJRA,AOSA,AzBLD,C+BAE,A1BMAsE,AcRA4J,AGMClC,ANFR,AOEf,CECuB,ATHP,AhBFO,E+BAE,ArBEAxC,AGEAM,CREC,AiBFC,EjBEC,C0BNC4K,AlBIA,CAACpV,ACFA,AQEE,ETAA,AeAA,CAAC,CfAC,CMNC,CAAC,CHIN,EGJS,AHIP,CGJQ,GSMG,AZFP,CAAC0N,CYES1K,CAAC,GlBFX,CAACC,AkBEe,GlBFZ,AKJa,AdAA,CSIZgI,CKJcjI,AdAAA,CcAC,AdAA,CcAC,AdAA,E8BEd,CAAC,CAAC,CfEU,CNAL,AMAM,CNAL;AWEnDP,EVGCsJ,AeHA,EKHE,ArBEAjM,AoBDA,AzBKA,AcRA6O,APMA,ANP8D,AUK9D,AhBFAhO,AOMA,AQRA,AdAA,C6BGC,AXHA,AbD8D,CwBI7D,AjBGA,AeAA,ATNAgD,ALIAgL,AQEA,AhBP8D,AYD9D,CJMC,AOCN,CUHO,AjBEAG,AFEA,ASDPoH,AIEO,ATHA,CeFCqG,AnBIAhQ,AIFAoD,CHEC,AeAA3M,AvBEA+E,AcRA,AnBEA,CUEC,AGEAyC,AeAA,A5BJA5J,AOMA,CGJCsH,ACIA6D,AiBFAjL,ANAAgW,AJRA,CPUA,AQRCpT,ALIA,AOCZ,CPDa,AQEA,CTAC,AFEA,AiBFA,AvBEA,ASJA,CKJC,AEKfwS,AHPevP,CCEC+H,AGMArO,AfEA,CGJC,AGEA,AREA,C0BNC,ArBEA,CAAC,AkBEA,AhBAA,CSDnB,AHPoB,AFMA,ATIA,CwBNC,AlBIA,AKRC,AFMDO,ATIAf,CKFC,CPEC,CiBFC,AJRAgE,CaIC2N,ATIA5C,CMAC,AhBAA,AZJA,CKMC,AaVC,AlBID,C4BIC,AvBEArH,GcRG,CAACiH,AZQA,CAACnH,EAAE,CYRC,AnBEA,AOMAa,CYRC,AHIA,CMEC,ANFA,AhBFCrH,CKMA,AiBFA,CjBEC+G,EEAE,CeFC,AtBJC,AOOvC,CeHuC,CNFC,EeFV,AfEY,AhBFE,AOOxC,CwBP2B,AxBO1B/H,CwBP2B,A1BMY,CaVC2S,CbUC,AWJA,CAACzC,MENM,CAACkD,AXWtC,CAACrL,EFDwC,CAAC,CWJC,CENE,AFMDkE,EENE,CAAC,CFMC,ATKtC,CSLuC,CTMjE,GSNqE,CAAC,ATMlE,CSNmE,ATMlE9L,EACP,CAAC;AmBLL,EhBDE,AEEA,ANPA,ACYA,AQXA,AdAA,E8BEE,ADCA,AjBGA,AFEA,ANAA,AcRA2O,ADFA,AFMA,APEA,CUNC,CAACE,ALIAnL,AQEAoT,AGCA,AzBLA,E+BAE,ADCA,AnBKA,AiBFA9T,ANAA,ANFA,CeFC+S,ADCAkE,AnBKA1U,AiBFA,AdFA,AQEApD,ANFA2N,CYEC/C,AdFAgC,AdFAlO,CKMC,AIFA2J,GUNG,CdQC,ALNA,ASIA,CEEC,ANAAxC,ALNAlH,CWMCqB,AQRAqT,CGMC,CAACpT,AtBJA,C8BCC,AdCA,CeFC,ADCA,AdCAxB,CcDC,ARGA,CAAC,CSJC,AHIA,A5BJA,C4BIC,ATNA,ALIA,CHIC,AiBFA,AdFAiD,CHICrB,CoBNCiT,C1BMC,ASJA,CTIC,ASJA,EdFE,CWMC,CAAC,AWFA,AtBJA,CKMC,AiBFA,EjBEE1N,AWJA,CAC/B,GLGmC,CAAC,ANAA,CAAC3F,GAAG,CAAC4C,CWH/B,EACV,CXE6C,CAAC,CAAC,C0BNb,AfIlCa,CeJmC,CAAC,gBfI5B,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AUFJrJ,AdED,ANPA,ASCA,ELKE,ACGA,ANAA,AEIA,AENA,ARLA,E8BCE,ADCA,AjBGA,ACFA,AILA,AFQA,CFHC,CQEC,AGCA,CCHL,CKFO,ADCA,AjBGA,AaFPgW,AEEO,AZCA,AhBLA,C+BAC+D,ADCApD,AjBGA7T,AGCAuK,AfNAvM,CqBKCmJ,AGCA,CPRC8F,CUOC,A5BJA,C4BICjN,A5BJAxE,CsBIC,CZDCmK,AHOAjI,ANXAM,CYKC,AZLAC,CYKCvB,AbJA,CAAC,AOUAgB,CeNC,AJPA,AlBGA,AOUAjD,ANXA,C2BKC,AZCA,CcJC,AFGAiZ,AZCArY,ATKA,ANXA,C6BEC6P,CRGC,AfMA,CeNChF,CZDCP,AkBCA,ClBDCV,AgBDzB,AEEyB,CGJC,ADCA,AFGA,CGJC,ADCA,CCDC,ADCA,AJC5BiO,ChBC6B,AGCA,CAAE,CHDA,AYCA,EAAE,GNCG,CAC/B,CHFiCjO,IAAI,CAACxK,CGE/B,CHFkC,CaF9C,AVKK,CHH0C,CAAC,EAAEwC,AGG7CqD,MHHmD,CAAC,CAAC,UGG7C,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AJJJrJ,ANPAA,ASCAA,EeIC,AjBGA,AFGAuJ,ANAA,AaVA,ATQA,EsBLE,ArBGA,ASLA,ALKAjF,AEKA,ATEA,ANXA,E2BKE,A5BJA,CYGL,ANPA,ASCA,CgBGO,A1BOA9D,AOJPkJ,AUCO2K,AhBRPzO,AmBSO,ATGA,ADXP4G,AdEO,C8BCCtD,ApBOAK,AKCAwD,CNLChF,ACID,AWHC,AfMAxF,CFHC/B,ASJA,AQCAd,CXGC,ANAAyF,ASJAV,EJAE,AeEAoR,AlBKA,CGPCpQ,ADEAA,EFKE,CDdhB,CQOkB,AFAlB,CUCmB,APPnB,CLMoB,ALIA,AiBHA9F,AhBRpBiG,AGSoBH,CCFC,AIAA,AFArBiE,AIKqB,APHAnM,CCFC,ALIAA,AWCAY,ATEA,AQbtBqO,COOuB,AbCA,CJEC,AiBHA,AGCA,ChBAC,CsBLC,A1BOA,AEGA,CwBVC,ANKAhP,AlBKAoH,CwBVC,CxBUC,CDd7B,ACc8BpE,COPCpC,AWEA,CbF/B,AaEgCwC,ClBKC,CeNC,AfMA,AQblC,COOmC,CRDC,CWEC,CXFC,AWEAT,ATGA,ATEA,CSFC,ATEAgF,IkBLI,CAAC,ETGE,EAAE,ATEA,EAAE5H,ESFE,ATEA,CSFCiQ,ATEA,aSFa,CAACnE,IAAI,CAAC,IAAI,CAAC,CAAC;EcL7EH,AjBGA6B,AKPA,EaEE,ArBGA,ACIA,AiBHA,AvBGA,AcTAnN,AHUA,AhBRA,AOUA,AELA,CmBDC,A5BJA,C4BIC,AdDAe,AQCA,AtBJA,ACDA,E8BCE,ArBGAsB,ACIA,AOTAgQ,AOOA,ATGA,CeRC+J,ApBOAjR,AKCAiE,CXDC1H,CEGC,CYZC,AlBCAtE,CkBDCnD,ALKA,CAACe,AWEAkX,CpBEC,AEGA,EIHE,AQTA,CRSCtM,ANAA,AcTA1J,CLKC,APOA,ANXA,C6BGCoJ,AjBGA6B,ACFA,AEKA,ATEAxI,CuBRA,AjBGA,AGGCpE,CEVC8R,AjBCAhQ,C6BGC,AjBGA,AKPAqE,CbSC,AoBFA,AlBKA,CAAC,CwBVC,ArBGV,CqBHW,ArBGVxC,AeEUtE,CMLC,ApBOA,ANAA,CMAC,ANAAsH,AcTA,CAACoH,ADAA,AjBCA,CkBDC,AMOA,AxBNA1L,CkBDC,ADAAuP,AOOAtS,CdEC,CAACsK,AVRA,CAAC,EeSE,CLDC,AKCA,CLDCxK,CNAC,AaTA,AjBCA,CUQC,ANAA4H,AoBFA,AxBNA,CUQC,AGJA,AILAyK,AOOAiG,CfFT,CAAC,AIAUzX,CJAT,AMKU,EAAE,EFLE,CJAT2J,ALIU,ASJArD,CEKC,CXDC,AaTA,AFUA+I,CSHC,CfFT,AQLUqC,CRKTvS,AeEU,CXFC,AWEA,CfFT,AIAUgP,AWEA,EfFR,CQLW,EbSE,AaTA,CbSC,AWCA,CAAClD,EFLE,CAAC,CEKC,CAAC,IAAI,CAAC,CAAC;ELAzE,AiBHA,A5BJA,AOUA,EwBVE,ADEApH,AjBGA,AREA,AcTAiK,ALKA,AILA,AFUA,APHA,CUPC,ALKA,CJACjM,ASLAoM,AGMAgI,ArBLA,E8BCE,ATIA,AGCApU,ATGA,CeRCkJ,ATIA1J,ANIAwN,CHHC9B,AKPAsF,ATOA,ARNA1P,CIQC,AcTA,CAAC,CAAC,AlBCA,E8BCE,A1BOA,AIFA,ARNA,C8BCC,ADEP,AzBKOwE,AaTA,ATOAE,CsBLC,ADEPvD,CjBGQ,CKPC6N,CIMC,CTCC,CJAC,CqBHN,AREO9F,AbCA1M,CCFT,AoBDG,AdMO,CNLTwE,AGEU,AGGA5D,APHA,CIAC2E,AYAV,AhBAU,CaDC,AJNA,AOOVlB,CPPW/D,CbSC,CAAC,EaTE,CLOC,AKPA6S,CLOC7G,CREC,EAAEvE,CyBLN,EAAE,CpBCF,AMKU,CNLT,ALIU,AaTA,AFUA,CXDC9E,AaTA,CYIN,AZJO,CYINyK,ALGH,CfFC,ALIU,AoBFV4K,CfFC,ALIUtY,EAAE,AWCA,CHHC,AREA,CQFC,AREA,AWCA,IAAI,CAACmQ,CSHT,CAAC,ITGc,CcNN,AdMOrE,CcNNA,GdMU,CcNN,AjBGO,AGGA,CcNN,AjBGO,GGGG,CcNN,AdMO,CcNN,AdMO,CcNN;ECDlE,ApBQAJ,AiBHAgC,AvBEA,ASJA,AEKA,AhBPA,AOUA,EGRE,AoBDAhJ,AjBGAkJ,AMPAvN,ADAA,EIMEyW,EAAE,AJNA1D,AOOA,AxBNA,CqBKC1G,AtBHA1L,CWOC0K,CAAA,CEHE,AMPA,AMOA,CZACe,AFGA,AQVAnM,AGMA,AGCA6X,AzBJAnX,CAAClB,COUCsI,ANZA,C6BGN,AREOsE,CQFN/H,AXJO,CAACqN,CDAC,AjBCAtO,CYMC,AeAAgK,ANDA,AfOAtF,CMNE7C,AeADiF,A5BJA,AOUD,CWbE,AjBCA,C6BGN,A9BDOzK,AOUA,ANZAyD,C6BGN,AZJO,CUOC,C3BNC,C2BMC,A5BJA,CaIE,AZNDC,CkBDC,AnBGA,CmBHCkL,CAAC,CNOGpJ,AMPF,CMOC,CAAC3C,CxBNC,CAAC,C6BGN,A7BHOe,E6BGL,AjBGS,AYAF,CZAGnB,CZND,CwBMC+V,CKHN,CAAChL,EjBGW,CAAC,CAAC,CAAC,GYAC,SKHE,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;ECAhE0Q,AlBIA,ARGA,ASJA,EJDE9X,AoBDA,AnBMA,AiBHA,AVPA,AlBGA,AOUA,AENA,EaDEoS,ArBLA,CAAC,C6BGC,AFGA,AvBGA7O,ASJAqG,AQAA,AJNA+E,AOOA,CKHCwG,AFGArP,ANDA5J,CXICsL,AXPAjL,CKOCgH,AEGA,CFHCL,AoBHA,CGAC,AHAAuQ,AxBNA,GSIJ,AkBEO3N,ClBFNzF,AHQO,EIHE,CoBPCyX,AHIA,CGJA,ArBEN,ALKO,AaVA,AXaA,CGRN,ACKO,AXPA,AOUAnV,CwBVC,A1BOArC,CaVC,AXaA,CePC,AtBHA,AOUAoD,CuBTC,AnBMA,AGJAkG,AQAA,CQFC1N,AnBMAH,ANAA,ASJD,ETIG,ASJA,AINA,AlBGAb,COUC,CAAC,EePE,AGCA,CdGC,AcHAuC,CfFN,ACKOF,AWJA,AfOA,CAAC2F,CGRN4C,IAAI,AYCO,CZDN,CoBDQ,ALGA,AzBJA,C8BErC,ALEsChI,AzBJA1C,COUC,CAAC,EIHE,CAAC,CcHC,CKFrC,ALEsC,AzBJA,E8BG7C,A9BH+CC,I8BG3C,A9BH+C,C8BG9Cma,ALC+C,AzBJA,CyBIC,GdGG,CAAC,MmBJzC,CAACpO,IAAI,CAAC,IAAI,CAC5B,CAAC;EpBDH,AGGA2B,AGEA,ATGA,EwBVE,ADIA,AnBGAvB,AiBHA,AvBGA,AcVA,ALMA,AILA,AlBEAjL,ASIA,EgBAE,CAAC,CKAC,AFAA,ANDA,AGCA,AxBNA,C6BMC6Y,AFAApO,CvBGC3D,ASJAhB,ALCAgD,CSNC,CIKC,AJLAsJ,CPSC,AWJAsD,CXICzU,CNAC,AoBHAb,AxBNAoC,CDEC,C4BIC,AdDA,AdHAzC,C4BICwJ,AvBGA,AIHA,CICCiD,CAACjD,ACFA,AWCA,CzBJC,ASIA,CmBAC,AHAA,AzBJA1K,ACFA,C2BMCiL,CfCC,AREA,AiBJA,CXIC,AWJA2B,AJLA,CYMC,AjBCA,ACFAxC,CgBCCtJ,AZNA,ATMAsJ,CEGC,AiBHA,AvBGA,CuBHC,AvBGA3C,AiBJA,AtBHA,CsBGC,AtBHA,EWOE,CAACiD,IAAI,CAACO,ENAE,CAACnD,EyBHE,AnBGA,CmBFrC,MzBE4C,ASJb,CgBExB,AhBFyBoC,ALCA,CJGc,AIHbG,CqBEjC,IAAI,AhBHkC,CgBGjC8P,AhBHkC,CAAC,ITIiB,CAAC,EIHX,CAACja,EqBEhC,ArBFkC,CqBEjC8L,ArBFkC,IqBE9B,CAAC,IAAI,CAC5B,CAAC;EpBHH,ACIA,AiBHA,AZGA4B,AhBPA,E+BAE,ADOA,AjBFA,AREA,AcVAhK,ALOAqD,ALAA,ESNE,AjBAA,CkBDC,CYGC,ADOA,AXVAgI,AGMA,AGCA,CMJCuK,ADOAM,ArBHA,CICC/L,CREC,ASHA,CAAClG,AQDA,AJLA,AOMAtG,GfDG8J,ALIA,AIHArL,CJGCkI,AiBJA,CAACyO,AGCA,CAAClN,EMJE,AfOA,CHFC,ACDA,CWAC,AhBAA,CsBJClJ,ADOA,AXVA,AHUCmK,CcAA5J,AjBFA,AMRA+N,ALOA,CKPC,CAAChL,AVOAoG,CgBAC,ATGC,CHFA,CHFCoB,AGEA5F,AREA,AiBJA,CZAA,ALIC,AcVA,CYGC,AZHA,AGMA,ANIE,CePD/E,ArBGA,EDCE,CJGC,CQFC,ACDA,ALAA,CICCyB,AREA8F,GyBAG,ALHA,CKIlC,CzBDoC,AoBHA,CpBGCE,G0BPG,A1BOA,C0BPC,A1BOAjD,CyBClC,EACP,AjBJ4C,CAC3C,ARC4C,CAAC,CAAC,CyBE3C,CAACmV,IjBHG3P,EkBN+C,CAAC,ClBM5C,CAACxK,EAAG,GiBGG,CAAC8L,IAAI,CAAC,IAAI,CAC/B,AjBHA,CiBGC,AjBHA;EFEHZ,AiBHAqC,AvBEA,AcVA,AnBIA,AOSA,EwBVE,ArBGA,AoBOA,AjBHA,AGAA,AfTA,CAAC,CaMC,ALAA,ARNA,E8BEE,ADUA,AjBHAM,AKVMyF,CaGL8F,ADUAW,A9BTA7Y,CUECuD,AICAO,AQDA,AGCA,ATGAoL,ELCElF,AOXM,ATONpL,CEIA,AVVCuB,CaMC,AQDA,AGCA,CdIC,AWLAoV,AGCA0B,CfDC,CICCpR,CEGC,AfTA,CSKC,AGIA,AeFAwG,A5BJArM,ASGA,CmBCCsJ,A5BJD,ASGCtC,ARNA,C8BEC,AlBOA,AGAA,ChBNC,CUEC,CqBHC7H,ArBGAkE,AkBEA,AdDA,CgBMC,AhBNA+C,AEGA,CcGC1G,AFLA,AZEA2E,APHA,CaDC,AbCA,CaDCmH,AbCA,GKAG,CiBJC,ATGA,CSHClM,ATGA,ANIA,CAACyB,CSHC,CAACE,IfDI,CAAC,CAAC,AoBOA,CACpC,ELPuC,CAACC,CMJC,AfOA,CePC,AfOC,CSHA,CKOpC,ALPqC,EKQ5C,GdLiDoI,CcK7C,CAAC4P,ALR8C,CAAC,CTGC,CAACpa,EAAG,CePA,CAAC,AfOA,CAAC,QcKtC,CAAC8L,IAAI,CAAC,IAAI,CACjC,CAAC;AXfL,EdWE,AEEA,EwBVE,ArBGA,AoBUA,AnBLAlB,AiBHA,AZEA,AhBNA,ASGA,EIGEiD,AZTA,E8BEE,ArBGApJ,AoBUA,AFRA+F,AvBGAtC,AiBLA,AJPYtF,AOQZ,ATGAwN,CePC+I,ADaAkB,ALTA,GGCG,CAACra,A3BPA,CSKC,ALKAkI,CuBHC,AvBGAN,AoBJA,AlBMAO,CGPC,AMIA,CHAC,AZTA,CYSCjG,AGAA,EePE,AHKA,CrBKCiG,CAAA,CwBVE9H,ADaA,CFRC,AvBGA,AEEA,CqBLCmK,CEQC,AzBLAxK,EAAE,CQDC,AeFA,CEQC,AFRAA,AvBGA,C0BRC,ADaAmZ,CCbC3Y,AlBOAgK,AFCf,AiBHe,CjBGdU,CiBHgB,EfEE,CAACH,KiBMK,AjBNA,CiBMC9I,AnBLf,CAAC,EoBRiB,CAAC,CpBQd,CAACuI,IAAI,CAAC,EmBKiB,CAAC,ICbI,CAAC,MDaM,CAAC;AXhBpE/H,EYIC,AtBIA,EqBSE,AjBNA,AFCA,ANAA,ALPA,AOSA,ANZA,ESKE,AkBEA,AdDA,AQDA,AJRoB,AFYpB2N,CGXL,AGOM,AJRoB,CPanB,AQZPgF,AGOO,CXKC7P,CiBHC,AvBGAwC,AaboB,AOSpB3G,AzBHAD,AOSAuI,CqBLCgC,ElBFE,CMIC,CXCC,AWDA2E,CLCC,AOboB6C,CPanB1Q,AcJA,AlBMA,CFFC,AoBJAnB,CfDCgJ,AkBEA,CAAC,ArBKA,EYdnB,ADDyC,CPanB,AOboBkJ,AOSpB,CdIC,AiBHA,AvBGA,AoBJAlS,CdIC,AiBHAwX,ATTxBzD,CZcyB,CWfqB,CbanB,AaboB,CRQzB,ALKM7N,AaboB,AOSpB,ATGA,CNJLtE,AeCM,ATGA,AhBNA,AOSA,CAACoE,EGPJ,AVFMjG,AOSA,CGPLqD,AHOM0D,GqBLG,CAAC,CTTrC,CTOiC,ALKM,ALPA,AOSA,CGPL,ALKMP,ALPAvG,AOSA,IAAI,CPTC,AOSAuG,IFFI,EAAE,GEEG,CAAC,OFFO,CAAC;AIHhE,EsBHE6U,AlBMA,AFCA,AVVA,ESKE,AoBUApc,AFRA,AvBGA,AEEA,EONE,AQDAwW,AJRA,EIQE,AGCA,ATGAvG,CMJC/N,CRCCgM,AITA+E,CbaC,AEEA5J,CuBGC,CAAC9I,CZlBC,CbaC,CAACoH,AabA,AFYA,EFHE,AEGA,ATGA,CwBTCyU,AxBSA9S,CwBTA,ATEC,CRCC1J,AQDA6W,CSFC,AxBSA,CePC,AfOC9R,CePA,CRCC,CAAC9E,AEGA,CTGE,EuBGC,AzBLA,CyBKC,AzBLA,CEEG,IONE,APME,COND8E,ETIE,CyBKC,AvBHE,CFFD+C,ASJA,APME/C,CuBGAnE,ChBTA,CAAC,CAAC,APME,CFFD,AEEE,CuBGA,AzBLDqH,AEEE,IuBGI,EzBLA,CAAClI,EAAE,CAAC,CAAC;AMCzD,AFLCyC,EIKCiL,AeHA,AvBGA,AEEA,ANXA,E8BEE,ArBEA,AYAA,AtBFA,CsBEC,CQUC,ARVA,AGCA,ChBDL,CSRO6E,AFYAhC,APJPlG,CRJQzG,C8BEC8Y,ADYApC,CpBVC,CDAV,CsBFY,AfMA,CcMC,AZlBA,CRQC,AQRAvT,AFYA,APJdsD,ARJczG,C8BEE,ADYD2W,A7BdA1W,GQIf,ARJkB,CYSC6J,CAAClD,AZTA,CiBJC,AFYA,EcME,AZlBAgI,CLaC,EAAE,KKbK,CAAC;AaOjC,ApBMC/P,EDJC,AkBGA,AvBGA,EQDE,ASLA,AGCA,AzBHArB,ACFAsB,CwBKC,CKUC,AhBVA,AWAA,CdGL,CECO,AFDP6I,AiBDOyN,AvBGA7Q,AiBNA,AJRAkL,AFWgB,CMHfjT,CQWCS,C9BbC,CaOC,AbPAQ,ACFA,CYSCmJ,AZTA7H,CIUCwF,C0BRCzF,ADaA,AzBLAkF,CyBKC9G,A7BfA,CYSC,AbPA,ACFA,C2BOCkY,ANHA,CQWC,AjBNA,AeFD,ANHCzW,CXIlB,AXNmB,C4BKC,AVXA,CjBIC,CUQrBgJ,CmBOuB,AzBLA,AadA,AjBIA1H,EIUE,CJVC,CiBJC,AjBIA,EqBIE,CAACgT,CtBFQ,C+BAhB,ATEU,CSFT/S,ATEU,CQWC,AnBPlC,EmBOoC,KCbL,CAAC,CAAE;AACnC,ErBGE,AYDA,AfOA,ANXA,E2BOE,AvBGA,AoBLA,EZIE,ACJA,AdJiC,E8Bc/BwW,AFRAvP,AVXA,AOSA,ATEAyF,CNFCjM,AeAAkT,CpBKC1P,ASLAyG,EgBUE,AjBNAV,CeFC,CdFC,AEEA,CeLCpL,ADaA,AzBLA,ALTwBpB,C4BMvB,AZAA,CFFC,CTKC,AoBLA,CKUC,ALVA0K,AzBJoB,C8BcnBqO,AFRA,CAAC9U,AdFAkJ,CdJkBlN,EKSf,CKLCgD,AIAA,AEEA,CNFA,AIAC,AWAA,ATEC,CFFAgK,AWAA,CfAC,AkBEA,AvBGA,CuBHCrM,AvBGAqF,EQDE,AbRQ,CAAA9H,C+BChB,ANGU,CMHT8D,ADaU,AjBNA,CCJC,CAAC,CgBWxB,CjBP0B,ACJA,AdJC,CaQAgC,CkBPT,AHKU,AvBGA,ALTP/D,C+BCF,ADcf,AFTyBsP,AvBGAlJ,C0BRR,ADchByS,E9BfoB,C4BMQ,CfEC,AeFA,CfECpY,AeFA,GvBGG,CLTbR,CKSe,IyBMrB,A9BfM,C8BeL+Y,A9BfKlZ,GaQuB,CACnD,AbT4B,EKS0B,CAAC,ALT3BI,IAAA,CaSrB,IAAI,CAAC8I,AbTgB9I,C8Bea,GACtC,AjBPa,AbTY,CaSX1B,EAAG,AbTQsB,C8BgBrB,CAAC6X,AjBNX,CAAC,CbV8B,EAAAzX,IAAA,G8BgBT,CAAC+Y,iBAAiB;ACd9C,ATEA,AfOA,ENVE,ESIE,AkBEA,AvBGA,EQCE,AKfA,AOSA/X,ATEA,CAAC,CcUC,AFVAqI,AdHgChL,AEGhC,AhBPyByB,CCCxBsC,CYUCgK,CHNCpL,ALKA,CyBOC4X,AhBbgC,AdJP,C4BOxB,A5BPwB5Y,C4BOvBjC,AdHgC,CiBF/BiD,A1BQA,CyBOC,AzBPAsF,CLVqB,ACCpBlE,C6BgBC,A7BhBD,E2BMG,A3BNA,CDDiBvC,GyBKvB,CGEW,AHFVwC,CGEW,EAAE,ClBFT,AGMU,ARDA,CKLTd,ALKU,ALVO,CaWN,AbXMvB,E+BEd,ArBGA,AeAA,CMHC6C,ArBGA,AeAA,CzBLa,GKUC,AoBLV,CAACkT,CpBKW1P,KAAK,CAACI,EoBLR,CfAC,AeAAyO,CMHC,ArBGA,CqBHC,CAAE,A1BQS,CAAC,CAAC,CAAC,KoBLL,CAAC,CAAC,CAAC;AMFrD,ATCCnU,AfQD,EGNE,ALKA,EoBLE,ATEA,AfNA,CwBIC,CGECsI,AdJ2D,AIN3D,AOQA,AzBN+B,CcI6B,AQAjE,CTQO+C,ACR2D,AQAlEwI,EQcS,CFVC,A3BNA5T,CqBEV,AJNW8Q,EYoBE,AFVA,CGLCvT,ATCdqW,GQciB,AFVA,CGLC,ADeA+D,AFVAxB,ANJlB,ArBFkB,C8BCC3Y,A9BDA+C,CiBJC,EjBIE,CiBJC,AjBIA,GYUG,CAACd,AKdAsR,CaKC,CAAC/Q,CHKC,A3BNA,CAAC,C6BgBC,EACrB,EjBPyB,CAACF,CiBOtB,AZrBuB,CYqBtB6X,AZrBuB,CAAC,CAAC3G,ELcE,CAAC,GkBTP,AbLU,CaKTtP,AbLUxB,KYqBlB,AZrBuB,CYqBtBT,AjBPuB,AKdA,CLcC,QiBOf,CAACK,EChBe,CAAC,CAAC,CAAE,CDgBb,CAAC,OAAO,CAAC;ACfzD,AxBSA,CwBTC,CrBIC,ALKA,AWJA,AfNA,CeMC,CSFC,EZME,AeJA,AdJA,AINA,AlBEA5C,EKYEwI,AoBNA,CAAC2P,CKaCuC,AFXA,AdJAzW,CcIC0B,CVVCoO,CbcCvL,ASRA,CgBeC,AzBPAR,CKLCwD,AoBYAjJ,ChBfCuB,CINC,CUUC,CAACvB,AdJA,AWEA,CXFCuM,AINA,AOQA9N,AzBNA,CkBFCwS,AlBEApS,EKYE,CyBOC,CAACoB,AzBPA,ALZA,CAACZ,E8BmBE,AFXA,ClBDC4J,AoBYA,AFXAhJ,ClBDCoI,AVPA,CAAC,C4BQC,AVVA,CUUC,ClBDC,CIHC,AINAgJ,CRSC,AoBYA,AhBfAhF,AWEA,CKaC,ALbA,GGEG,AdJA,CcIC,AdJA,GING,AOQA,EPREoF,AOQA,IAAI,CPRC,AOQA5S,CPRC,GOQG,CPRC,AOQA8K,CPRC,GOQG,CAAC,IAAI,CAAC,CAAC;AlBOnE,ESHEiE,AfNA,E8BAE3O,ArBIAsB,AGKA,AeJA,AvBIA,AoBNA,CGEC,CdHC,AIPA0Q,AlBEA,EyBME,CAACgF,AxBHArU,C6BgBC,AzBPAgE,ASPA4G,CiBFC,AHKA,AdHA,CiBFC1J,EDgBE,AhBdA5E,AEIA0P,CeNC,ADgBAsK,AzBPA,AWHD,CeNEqC,CbLC,AFWA,AfNA3Y,CISC,AJTAC,C8BAC,CAAC,AbLA2P,ERSR,AIFU,CJETnP,AIFUoK,AbFA,CISC,CadC,AjBKA,CiBLCiF,EbcE,AoBNA,CKaC,AzBPAtM,AadA,AOQAjF,CPRC,CAAC,CYqBCgY,IAAI,AhBdA,AWCA,CKaC,AhBdA,CgBcC,CpBZT,AeDU,CfCT9P,ALKU,ASPA,CTOC5C,ASPA,GJEP,CAAC5H,AeDU,EfCR,CAAC,CeDW,CpBMC,AoBNAwY,EpBME,WAAW,AoBNA,CpBMC,AoBNA,CAAC;AlBOjE,EwBTE,ErBIE9T,AGKA,ARAA,AoBNA,ATGA,AfNAhC,E2BKE,AdHAiM,AINAgF,AlBCAxS,CcKC,CAACwC,AWCA,CAACtB,CKaC,AjBPA0L,AeJA,AZCA8B,CYDCtK,AvBIA,AabA,CJMC,AINAkH,AjBIA,CAAC9J,C6BgBC,CAAC0X,AzBPA,ASPAxW,CJEN,ALKOmE,AJTA,CSINjD,ATJO,C2BKC,AdHA,CcGC5C,AVTA,AFUA,CEVE2R,AOOD,CfCN,AeDOxR,CfCN,AMEOjC,EHGE,AKbC,AjBID,EDHE,ACGA2D,CYSC,AbZArC,C4BQC,AVTE,AOOF,CKaC,AFXAa,AvBIA,CyBOC6N,AzBPA,AWHA,CHGC,AYNA,ATGA7P,AfNA,CYSC+E,AbZA,ACGA,CDHCnE,E4BQE,ClBDN,AkBCO,CHFC,CfCNoJ,CGKQ,CAACvI,AbZA,CKYC,AoBNA,CfCN,AeDOlB,AzBNAS,CUON,AkBCO,AvBIAuG,CyBOC,AFXA,CEWC,AdVA,CSHC,ATGA,AhBTA,CyBMC,AzBNA,CKYC,AoBNA,CpBMCK,IQAI,CAAE,ARAD,CAAC,CAAC,CAAC,CWHC,CAAC,GHGGoC,IAAI,CAACxK,EAAG,EAAC,CAAC;EkBPtE4L,ArBGA,ALKA,AoBNA,AlBMA,ANTA,EYSE,AeJA,AZCAiE,AhBTA,CAAC,CcKClB,CAAC,CiBDC/C,AlBQAmC,ACPAc,AINA,CaKA,EAAG,CDeCyB,CdVC,CEVCyD,AFUA5R,CTGCyH,COPC,GAAG,CgBcC,EAAE,AjBPA,CGHC,CHGC,AGHAuG,EEVE,GAAGlQ,CYoBC,AdVA,CAAC,EEVE,AXaA2J,CWbCvG,AXaAwG,KOPK,AINA,AFUA,CEVCiK,AFUA,GTGG,CWbC,CAAC,AXaA9T,EAAE,EAAE;EGH/C,ALKAgI,AoBNAhH,AzBPA,ACIA,E8BAE,AHIA,AZCA,ATGA,EMAE+M,ACPAY,AWEA3N,CXFC,AWED,CMHE,AjBCA8N,AINA,AFUA,CeLCmN,ANGA,ATEAnM,AfLA7L,C2BICuG,EEWE+F,AZpBAuD,CJMC,CcGC,AdHA,CJGCtP,ALKAwD,ASRA,CiBDC,A1BSAjI,AadA,CaKC6L,ADeA,AFXA,AVTAkF,EYoBE,CjBPC,ARCA,AWJA,CHGC3O,AKbA,AFUAsO,CXIC1J,AadA,CaKC,AHIA6D,AVTA,CaKC,A9BAA3G,C8BAC,AbLA,AjBKD,CeKE,CAAC,AfLA,CeKC,CXIC,CQDC,CHJCO,AGIApC,ARCA,CKLCqC,EGIE,CAAC,GHJG,EAAE,KGIK,CAAC,KeJV,CAAC0G,cAAc,CAAC,CAAC;EZEnD,AhBRA,E+BGE,ArBIA,AGIA,AeJA,AvBKA,AoBNA6L,AlBKA,ANRA,EaCEtT,EiBDE,AHIA8G,CGJC0R,AjBCA,AdJAta,CUOC4I,AoBWA,AhBdAuE,AINA,AXaAxH,CuBOC,AzBNA,AJTA7E,C6BeC,AFXA,CEWC,CpBXC,AoBWA,AFXA,CvBKCkE,E0BTE,ArBIA,CqBJCgF,ANGR,CAACqL,AxBHQ,CAAChU,CMQC,CFCC,CKLCoH,ALKA,AoBNR,AxBHQ,C8BAC,A1BSAxD,AoBNR,AlBKQ,ANRA,C8BAC,AjBCA,AWER,CMHS,AjBCAhD,GAAG,CAAC,APOA,CFCC,ALZAjC,CAACP,CUOL,ALKMyF,CKLL7D,AHIM,CAACsE,EGJJ,AVPM,CUOL9C,CLKO,ALZA,ACGA,CAAC,ISIF,ALKM,CKLL,CHIO,CAAC,UAAU,CAAC;EwBPxD,AfMAuL,AfNA,ESIE,AGIA,ACPA,AWEA,AzBNA5O,CcIC,CcGC,AvBKA2F,EKLEyD,AoBWA,ALZA,CAAC4L,CPRC,ClBEC,CUOC,AkBAAxL,A5BPA/I,CKYC,CKLC,ALKA8F,AadA,CAACqM,AFWAhE,CAAA,ChBTE,CgBSC,AhBTA,CyBMC,CAAC,CAAC,EpBME,GAAG,MAAMnJ,ALZA,CkBFC,AlBEA,CkBFCkN,KbcK,CuBLd,AvBKehN,CuBLd8D,KVToB,CbcC,AadA,CbcCvD,GuBLZ,CAACkD,EvBKiB,CAAC,CuBLd,EAAE;EGFzCmB,ANEA,AxBFA,EYOE,ACNA5E,AEIA,AhBTA3F,AOWA,EGJE,AoBWA,AzBLA2F,CyBKC,CjBPC,AeLqCgE,CfKpCP,AZPAtG,CiBNCmO,CJOC,AdLA,CUOC,AIFAnL,AdLA7F,C8BkBC,AjBPA,AREA,AWJAqP,CXICxJ,EKNE,AGIAsD,CHJCY,AoBWAvK,A9BlBA,CAACQ,CcKC,CiBDCsK,AlBOA,AKbA,CaMA,A1BSC,AafA5E,CYoBC,AhBbA,CiBDC,ADcAjG,A9BlBA,CKaED,ALbD,ACIAqD,CeKCwM,AfLAvM,C6BcC,AdTAwM,EEXE,CbeE,CafAoD,CRSC,AoBWA,CpBXCvJ,AIFA3J,AEIA,CXIG,CWJD,ENFE,CAAC,AIFA,AbDA,EaCE,AbDA,C6BcC,EAAE,AZpBA,CAACf,OAAO,CAACW,OAAO,CAAC;ELczD,AYJA+X,EMHE9T,ArBGA,AVPA9E,AOWA,ANPA,E2BC+C,AdA7CwB,AEIA,CYJ8C,CEa5CmZ,AFb6C,AvBQ7C,AafA,AjBMApW,EMOE2F,GONG,AEIA6G,CXICtP,ASRAA,CWECmX,AlBIA,CwBPN,ADcO,ALXD,CMHL7T,CNGQ,AzBPA,AOWA4C,CuBOC,AzBLA,ASRA,AEIA,AhBTAvG,CcKC,AEIA4P,AfLA,EISG,C0BTP,ADcO,A9BlBA,C+BIN,ADcOyJ,A9BlBAhZ,CCIC,EeKE,AfLA,CeKC,ChBTC,AOWA,ANPA,CDJC,AOWAyI,IFEI/J,CEFC,CAAC8J,EwBPL,ADcO,AzBLC,E0BTN,CDerB,ChBd8B,EiBDL,AjBCOhJ,CiBDN6M,ADetB,AvBR6B,CuBQ5B2M,AvBR6B,GONG,AEIA,CFJClT,CEIC,KFJK,CAAC6H,AEIA,CAAC,CAAC,CcU5B,AzBN6BnO,AWJA,CcU5B6Z,ECfwB,CAAC,C1BSQ,CAACvT,ASRA,CAAC,KTQK,CAAC9F,KAAK,CAACvB,IyBMzB,GAC1C,AzBP2E,EAAC,EyBOxE,CAACqZ,WAAW,CAACwB,gBAAgB;EpBZ3C,AGKA/O,AbZA,E+BIE,AHCA,AdAA,AWEA,ATEA,ATEA,CqBNC,AdAA,CIPC,AjBMAzH,CiBNC,CYsBC,AjBRAyH,ARCA9E,AafA,AOSA,CZKA,AYLCkQ,ClBICjQ,CMCC,AePA,CEeCwT,EzBPE,CAAC,EEFE,CNPC,CISC5T,CyBOC,AvBTAmD,CNPC,C6BgBC,CLbP,CpBMS,AoBNRvG,CpBMStD,AEFA,ANPA,CMOCkI,GFEG,CAACjI,AoBNR,CAAC,CAAC,AlBIQ,CAACF,CkBJP,ClBIS,CAAC,GFEG,CAACqB,KAAK,CAAC,CAAC,CAAC;EKJ9C,AIHA,AdJAL,E+BGE,AlBQA,AKdA,AFWA,ATGA,ANRA,E2BCE,AvBQA,AoBNApB,AzBNAoB,CKYC,ALZAlB,C+BGC,CAACwZ,CDgBC,AjBRAtL,AGHA6C,CTGC,CqBPCjG,EEeE,A9BnBA,CUOCS,AMCA,ATGAzE,CPXC,E8BmBE,AdXA8J,CcWC2J,CChBC,CAACzZ,CxBQC,CMAC,ANAA,CAACiG,CGJCwE,CAAA,AGICT,EHJE,EMCE,CAAC,ATGA,EuBQE,AvBRA9D,EuBSrB,AdZuB,CSFf,ATEgBgJ,CeLC,ANGhB9O,CMHiB,CDiBtB,AvBTuB,CuBStBqZ,AFhBQ,CAACvP,AHED,CAAC,ElBKkB,CwBRC,EAAE,AfKA,CAAClI,GeLG,AHCf,CGDgB+Z,AHCf,CZIgB,CcYtB,AjBTQ,AGHe7L,CcYtB3O,AjBTQoC,GGHkB,CAAC,CAAC,CAAC,CAACqM,CeLC,CAAC9E,ADiBvB,CAACtJ,GCjB0B,CAAC,AfKA,CAC/D,CcW0C,AjBTQ,CiBSP,AjBTQ,CkBRgB,AlBQf,CkBRgB,CAAC,CfM/D,EACN,CcUkD,CAAC,EdTrD,CAAC,WSLyE,CAAC;AXD/E,IiBDI,ArBIAE,AGIA,ARCA,AadA,AOQA,ATKA,AhBXA,ACGAA,CISC,AoBNA,CpBMC,AEDAqE,EwBRE,AlBQA,AeR+BgE,AVL/BqI,CaKCgG,AlBQA7T,CiBSCgV,AdTAxJ,CSLC,CxBHC,CMQC,ANRApO,CMQCgF,EMAE,AZRA,CYQCsF,AZRA,C6BiBC,CAAC9K,AZtBA,CAAC2O,CaKC,CAAClQ,ArBIV,AMIU,CNJT4D,AHIU,CWbC,CAAC,AFaAqM,CHAC,AKbA,AXaA,EuBSE,AZtBA,CYsBCzO,AjBTA,CGAC,CHAC,AGAA3C,CcSC,AvBTA,ANRA,C6BiBC,C7BjBC0E,GeQG,CeRC,CAChC,ArBGuB,CAAC,AoBaU,AdTA,CcSC,AdTA,CAAC,CAAC,CNJT,CAAC,CTJW,CAAC,E8BC/B,EACV,IAAI,CAACyY,cAAc,CAAC9Q,IAAI,CAAC,IAAI,CAC/B,CAAC;AjBFJrJ,EiBGC,A1BMA,AJTA,ESIE,AGIA4H,AGAA,AhBXA,E4BEyC,AVJvCgI,AOQA2E,CGJwC,AdC7C,CgBiBO,AFlBuC,AdC9C7I,APQO,EGJE9D,AMIA2G,AhBXAlP,IaWF,CAACqG,AGAM,AhBXA,CkBFC,CAACpB,CFaC,AhBXA,EUOJ,AeDF,CfCGqB,AGIA,AYLF6O,CZKG,AGAMhG,AhBXA,CaWL,AbXM1Q,CaWL8M,AKbM,COQP,CfCG,AQTM+F,AOQR,CfCG,AIJpB,AWGkB,CfCG,AGIA,AGAM,CHAJnF,AGAK4C,CFR5B1C,CdH8B,CAACpM,EaWH,AGAK,EAAE,CEbC,CLaH,AKbI,CFaC,CAAC,CAAC,AhBXA,CgBWC,AhBXA,IAAI,CAAC,EcG9C;ATUD,E0BLE2L,A9BHA,ESGEhJ,AkBLA,AVJA,AOQA,ATKAtD,EHAE6M,EiBSE,AvBTA,CNPC7J,EYOE,AGAA,CcSC,AjBTAqI,AGAAxH,CcSCoV,CvBTCtQ,CSAC,CNJN,AMIQ,CNJPhF,EGIS,CkBJC,AlBICyF,CHJP,CAAC,AHIO,CwBJEA,ClBIC,CNAAzD,CSAC8J,CeJE,ADaD,A7BhBAzM,CYOG,AZPH,E6BgBGmW,A7BhBA,C8BGG,AfID,CTAA,CSAC,ATAAjT,CSAC,ENJL,CAAC,CoBaQ,CAAC,AvBTA,CuBSC,AvBTAqC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;AFCpEvC,EKJC,AkBLA,AVJA,AOQA,EMCE9B,AfIA0J,AhBXA,ACIA,GIOH,CyBSO,AjBTA,ARAPhE,AEAOQ,EwBJE,CAACgW,A9BHAna,C6BgBC,CAAC2X,CjBTC5O,AGAN,CAACtD,ATAM,CFAd,AEAe4B,EwBJE,CAAC+S,A1BIlBzW,AJPkB,CAACpD,CeOL,CHAO,AGAN,CAAC,AfPM,CeOLoK,ATAM,ANPA,CYOC7C,ANAA,EuBSE,AzBT1B,C0BJ2B,ADaA6F,AdTN,CeJO,AlBIA,AGALpC,CeJM,AlBIAjO,CkBJC,ClBIC,CkBJC,CfIJ,CeJM,EAAG,AlBIDgO,CGAH,IcSQ,A7BhBA,C6BgBC,A7BhBA,I8BGIxD,GlBIG,CkBJC,CAACxK,EAAG,EAAC,CAAC;ArBCzD,AkBLA,EGKE,AbRAiU,AOQAoE,AxBHA,C8BGC,C/BPC,EgBWE,ATAA,CWZCpE,AXYA,CMAC,AKZD,EYqBG3D,AZrBA,AlBCAtO,EaWE,AGAAkP,CHACvD,CYJC0K,CAAA,EAAG,CKaC,CdTC,CcSC,EdTEpK,CHAC,CAACzD,GGAG,CcSC,AjBTA,AGCnB2G,ChBZoB,CaWC1F,EbXE3J,EgBYjB,CAAE0I,EhBZoB,CaWC,AbXAvI,CaWC,AGClB,IAAK,QhBZyB,CAAC,eAAe,CAAC;AUOnEQ,AkBLAA,EGOCka,A9BHA,EiBNE,AOQA,AzBPA,EaWE,ANAA5V,CGLL,AGKM,AeVN,ClBKA6D,AGKO,AeVPgO,AVFO,AOQA,ATKE,AhBZF,CyBOCZ,AzBPAhW,ACKAqC,C6BeCkM,EZrBE,AFaEa,CeJD,AbTAe,AXYA,CAACjL,CuBSC,CCZCyV,CAAA,ADYC,AFnBhB,AHMgB,ATKE,CSLD/Z,EGNjBgW,AZWqB5H,CNNrB,AHKoB,CwBHC,CNDC,CfDtBpG,AHKuB,CSCG,CSLDlI,ATKE2O,CfPDhN,CiBNC,AlBCA,ACKAC,C2BJ3B,CVF6B,AFaE,AhBZF,AOWA,CSCGkG,IAAI,CAACO,CNNrC,IMM0C,CAAC,CfPD,CwBET,CAACxH,AxBFU,MwBEJ,CAAC,CAAC;IMEvC,ANDA,AxBFA,EYME,AKZA,AlBCAnC,E+BQE,ADYA,AdRE,ATDF0F,ANNAxC,C8BGC6X,ADYA,CAAC,AjBTAhQ,AKZA,AOQA7H,CKaC,AZrBA6N,CYqBC,AdREpB,ChBZD,CAAC1P,AOWA,CAAC0F,GwBHG,CAACkN,A/BRA,CAAC,EOWE,CAAC5S,ANNA,C8BGC,AfIE,CeJD,ANDA,CMCC,AbTA,AFaE,CEbD4S,COQCvR,AlBIA,ANNA,CMMC,CNNC,EiBNE,AjBMA,CiBNC,CLYZ,AKZa,CLYZ,WYJc,CAAC0B,KZIE,CAAC,YYJe,CAAC,CAAC,EzBPY,CAAC;I+BSlE,AlBGA,AKZA,AOQA,CZIC,CiBSC,AjBTA,AbXA,AOWA,ANNAE,CMMC,CwBHC,ANDAA,CMCCyY,CfIG3L,KAAK,IeJE,CAAC,AfIEJ,CeJD,A9BHA,EwBEE,CxBFC,CwBEC,ATKE,CAACK,EfPA,EeOI,CAAC7G,IAAI,CAAC/J,OAAO,CAAC;EHA5C,AKZA,EaSEW,ADYA,A9BpBA,AOWA,ANNA,C6BeC,AvBTA,CuBSC,ALbA,AlBIA,ESCI,ESLA,CMCC,ANDA+W,CMCClT,GAAG,CAAC,eNDe,CAACrC,CMCC,CAAC,GNDG,GAAG3C,IAAI,CAACC,SAAS,CAACoE,eAAe,EAAE,CAAC,CAAC;EMExE,ADYA,AjBRAqJ,AKZAqG,AXWA,CwBHC,CNDC,AxBFAtR,IeOM,IHAEiL,AZPA,CYOCnD,AZPA7H,EeOIyO,CfPD,CYOC,AZPA,EYOE3F,CKZCuI,AFYE,CEZDhP,IAAI,ELYE,AKZA,ELYE,MZPM,EAAEV,eAAe,CAAC;E8BKnDsY,ADYA5C,ALdA,AxBFA,EYOE,AKZA,AlBAA,EgBYI,CAAC,CEZD,AFYE,CEZDhV,AFaA2E,CHDCuE,EGCE,CEbC,AFaC1D,CEbA0J,EaSE,CfIE,CcQA8F,CCZEnZ,ADYDf,EdRI0K,CHDD,EkBHG,ClBGA,AGCE,CcQD,AdRExK,EeJE,ADYF,AZrBA,AFaE,CHDDuL,AGCE,CEbD,yBLYW,CAACf,IAAI,EAAE,IAAI,EAAEiB,QAAQ,CAAC;AYJ/D,ElBIE,ANLA,E8BGE,ADYA,AjBTA,AbZA3J,EkBAE,AFaA,EeJEjB,AlBGA,CAAC0E,AbZA,ACMAhB,C6BeCqW,AdRA,AhBbA3Y,CgBaCsD,EeJE,CAACzE,ADYA,EjBTE,CkBHC,ADYAhB,AjBTAyC,CGCC,CAAC+J,GeJG,C/BTC,C8BqBC,A9BrBA,C8BqBCsO,A7BfArW,CAAA,EYMG,AZNA,C8BGC,ADYA,AjBTA2J,IkBHI,CAACrN,CfIC,CAAC,GeJG,CAACmc,ClBGC,CAACzX,KbZK,C+BSC,A/BTA,CaYC,AbZArD,C+BSC,AlBGA,GGCG,CAAC,CAACuK,KhBbK,EgBaE,CAAEC,AhBbD5M,IgBaK,GhBbE,CgBaG;ASNxE2C,ElBKC,EuBUE,AjBTA,AKZA,AlBCAT,ACKA,E8BGE,CNHL,CAAA8V,ATOO,EeJE,ADYArX,CCZCwc,AlBGA/O,AZNAxL,CeOCwO,GTFGlH,EuBUE,EdRE,AfPA,C6BeClK,AdRAwR,AfPArO,CMKC+G,CwBFC,ANHrB,AlBKoB,CwBFE,AlBGA,AbXA,ACKA,C8BGC,A/BRAhK,AOUA,ANLA,CwBAvB8X,CzBLyB,C8BoBC,CAACrX,AdRA,CAACiM,AhBZA,IgBYI,AhBZA,CgBYC1H,AhBZA7E,C8BoBC,GdRG,CSPrC,ATOsCH,AhBZA,ACKA,CDLC,ACKA,CeOC,AhBZA,CgBYC,EAAE;EHA1C,AZNA,E8BGE,ADYA,AZrBA,AlBCA,AOUA,IAAIuH,ESEE,STFS,GAAG,MAAM,IAAI,CAACF,EAAE,CAACE,WAAW,CAAC,IAAI,CAACK,SAAS,EAAE,UAAU,CAAC;AME3E,EkBHE,A9BFA,C8BEC,CDYC,AZrBA,AlBCA,AOUA,IPVI,AOUAG,CNJCvD,C6BcCjE,AZrBA4T,AFaAzH,EhBZE,CAAC3M,AOUA,CSEC,CAACoC,CTFC,CPVC,C8BoBC,C9BpBC,E8BoBE9B,CvBVCkH,ESEE,CAAC/E,AfNAgC,CAACC,G6BcG,CAACjE,CdRC,CEbC,AFaA,AfNA,CMIC,CAAC+G,ANJA,CiBPCvC,IAAI,CAACkP,AFaA,CAAC,GcQG,CAAC,AvBVA,CAACpM,QWXQ,GAAG,AXWA,CAAC,EWXE,EXWE,CAACF,KuBUK,CAAC,GvBVG,CAAC;AMCxEnF,EkBDCsa,EDWE,AZrBA,AXWA,ANJA,EDNE/a,CaUL,CAAAoL,AGEO,AfNA3I,CeMC,CcQCoW,AZrBAzG,CXWCrM,CwBDCgV,CAAA,C9BHE,C8BGC,AfGA,CHFd,ANAe,CAAC5U,EMAhBiF,AZJkBjK,G6BcG,CvBVC,CAAC,CuBUC5C,A9BpBA,AOUA,CPVC4B,CaUzB,CZJ2B,EAAE,CiBPC,EYqBE,CAAC1B,AZrBAuE,ClBCC,CAAC5C,EkBDE,CAACiS,AlBCA,CAAE,C8BoBA,CAACtS,SAAS,CAAC,AZrBA,GAAG,CYqBC,A9BpBA,C8BoBC,CZrBC,ElBCE,CAAChC,IAAK,EAAC,CAAC;EOWlE,EwBDEsF,ADWA,AZrBA,AlBCA,ECMEZ,IiBPI6P,AFaA5H,EeHH,A9BHK,C8BGJlH,CfGM,CAACrD,AfNA,IAAI,K8BGA,AfGK,CeHJ,AfGKC,GAAG,CeHJ,AfGK,CeHJkX,ObVY,AFaA,CAAC,EEbEtU,CaUJ,CAAC,CAACS,CbVM,CAAC8O,SaUI,CAAC,IAAI,CAAC6E,KbVU,GAAG,GAAG,CaUJ,CAAC;AxBEpE,IwBDI,ADWA,AZrBA,AjBOA,I8BGI,AfGA,CeHCA,CDWC0B,AZrBAtG,UYqBU,CCXC,CAAC/D,CDWCoK,ICXI,CAAC,CAAC,MDWM,CAAC5Y,GZrBG,GAAG+C,IAAI,CAACyP,EYqBE,CAAC,UZrBU,GAAG,EYqBE,CAAC,AZrBA;AXWjEhS,EwBAC,EDWE,A9BpBA,ACMAC,EeME,CAAC,ATHN,CSGO,ATHP0G,EuBWS2R,E7BdE,CAACpY,GAAG,CMGf,ANHgB,C6BcC,EvBXjByG,CuBWoByR,QvBXpB,GNH+B,C6BcC,CAAC5Y,A7BdAwC,MAAM,CAAC,M6BcM,CAAC,oBAAoB,CAAC;ECTnEyY,A9BJA,E6BcE,AZrBA,AFaA,AhBZA,CgBYC,CAAC,IcQIlC,A9BpBA3Y,G+BUG6a,CAAA,EAAG,K/BVK,C8BoBC,E9BpBEpb,C8BoBC+Y,I9BpBI,CAAC5Y,O8BoBO,CAACA,K9BpBK,CAAC,O8BoBO,CAC7C,oB9BrBkE,CAAC,Q8BsBrE,CAAC;A7BfL,EeME,EeFEoD,AbXA,AlBCAhD,MkBDMqS,EaWH,CAACpP,E/BVO,CAAChD,OAAO,C+BUJ,CAAC,AbXK,ClBCC,EkBDE0C,CaWJ,CAACsU,EbXO,AlBCA,CkBDC3E,GlBCG,CAAC5T,I+BUD,A/BVK,C+BUJ,A/BVK,C+BUJ4E,AbXK,AlBCA,GkBDG6O,SaWI,CAAC,IAAI,CAAC4E,YAAY,CAAC,CbXM;AjBO1E3W,E8BKC,AfGA0N,EcSE,AZvBA,GjBMH,CeQOA,AfRPzN,CeQO,CEdEkS,CFcC,KEdK,AjBMf,GiBNmB,AjBMnBlS,QAAA;AiBLD,IYuBIoY,AdTA,AhBbA,IgBaI,CEdC9V,AFcAO,IEdI,CYuBC,AZvBAvB,CYuBC7B,CdTC,CAACA,EEdG,KYuBI,CAACC,CdTC,CAAC+N,CcSC,CAAE,GAAEyK,CdTC,CAAC,EcSG,SdTQ,CAAC,KcSK,CAAC;AZtBpD,EaWE,EDYEG,AdTA,AhBbA,IgBaI,AhBbA,CgBaCrL,AhBbArP,G8BsBG,CAAC6B,CZvBC8C,GlBCG,CkBDC,AlBCAxE,CkBDCqU,KYuBK,AdTA,CAAC1S,EcSE1B,EZvBG,GlBCE,CAAC,C8BsBC,AdTA,CAAC0P,EhBbE,CAAChQ,GgBaG,CAAC,ChBbC,CAAC,EAAE,OgBaO,CAAC;AEbtD,EaWE,EDYE2a,AdTA,EhBbE,E+BUEmC,AfGA,IAAI,CAAC1X,CcSC,CAAC0V,ICZIgC,CAAA,AfGC,CAAC9a,CeHC,AbXAgS,GYuBG,GAAG,EdTE,CAAC5C,EcSE,MdTM,CAAC,IEdI,CAACuD,MFcM,CEdC,AFcA,CEdC,CAAC,AFcA,CEdE;AACxD,IaWI,EfGE,AhBbA,I+BUIqI,AfGA,AhBbA,CgBaC5N,AhBbAnP,QgBaQ,CAACuC,AhBbA,C+BUC,AbXAyR,AlBCA7R,EgBaE,CeHC,AfGA,IeHI,CAAC6W,G/BVG,CAACtX,KAAK,CAAC,E+BUE,CAACc,AbXA,CAACkS,AFcA,EAAE,EeHE,CAAChE,CfGC,CEdC,AFcA,CEdC,CaWC,AbXA,CaWC,AbXC,CaWA;AbVtD,IaWI,ADYA,AdTA,AhBbA,CgBaC,MAAM,gBEdgB9L,IAAI,CAAC+P,iBAAkB;AAClD,ElBCE,E+BUE,ADYA,EdTE,EeHEvK,ADYA,CAAC2O,CdTC,CAAC5J,CeHC,GAAG,IfGI,CcSC,AdTA5M,CeHCiI,ADYArI,EdTE,CAAC,QcSQ,CAACuY,CZvBCxG,SYuBS,AdTA,CcSC,CdTC,IeHX,CAACnJ,AfGe,CAAC,UEdU,CAAC2J,EaWb,CAAC,CAAC,GbXkB,CAAC,CAAC,CAAE;AACzE,ElBEE/T,E+BSE,ADYA+Z,AdTA,EhBZE/Z,CAAA,EAAG,C+BSC8C,GAAG,CDYC,CAACqX,CCZCxY,MDYM,CAAC,IAAI,CAAC,CZvBCsC,EYuBElF,EZvBE,CaWT,AbXU6U,CaWTpR,GDYa,CAACvD,ECZR,ADYU,CCZT,EbXa,SaWF,CAAC;AbV5C,EFcE,EeHE,ADYA,A9BrBAK,I+BSI,ADYAqY,CCZC7U,GAAG,A/BTA,CAACrD,C+BSC,a/BTa,C8BqBV,A9BrBW,C8BqBVsa,G9BrBc,CAAC3a,GkBFGqU,ElBEE,C8BqBV,A9BrBW,C8BqBV,C9BrBYhS,MAAM,CAAC,CAAC,gBkBFgB,CAACsS,OAAO,CAAC,CAAC,CAAE;AAC7E,EFeE,AhBbA,E8BqBEkG,ECZEpb,EfIEqQ,QcQQ,CAACrP,IZvBI8T,AFeAzE,CAAA,EAAG,ScQS,CAAC,ECZd,AbXgB,CaWfjP,AbXgB8T,IaWZ,ADYgB,CCXjC,CDWmC,CZvBC,CAAC,CAAC,CAAE,QYuBO,wCCVjD,CAAC;AbZP,AlBEA,IgBaI,CEfC,CaaC,ADUA,IdRIlK,EcQEA,CCVC,IAAI,qBfEM,CAACE,CcQC,CAACE,QdRQ,CAAC,CAAC,OcQO,CAAClL,OAAO,CAACE,EAAE,CAAC;A9BrBtDyC,EgBcC,EeFE,AbbArB,EYuBE0Z,C9BtBL,CAAAlb,GkBDU,CAACqF,GAAG,CYuBC,AZvBA2P,CYuBCpS,KZvBK,AlBCrB,C8BsBsB,AZvBA,CYuBC,CAAC,A9BtBxB5C,cAAA;EkBAC,AFgBA,EeHE,ADUA,CAAC,CAAC,ECVEud,AfGAjN,WeHW,AfGAA,CAAA,CeHE,CfGC;EEdpB,EYsBE,AdPA,EeHE,GbZG8E,CFeCpK,CcOCkQ,OZtBO9F,CAACnR,EYsBE,CZtBC,EAAEwO,UAAU,EAAE,EFeb,CAAChH,UAAU,CAAC,CAAC;EcQlC,AdPA,EEfE,EaYE,EbZE,CAACxH,CaYC,CAACuV,CbZC,EAAE,SaYS,CAACxW,KAAK,GAAG,EAAE;AfIlC,EcQE2K,ICXI,AbZA,OAAO,IAAI,EYuBEA,CAAC/C,IAAI,EAAE;AdRzB/H,IcSG,AZvBA,EaYE,CfEL,CcSO+H,AdTP8E,EeFS,CAAC9E,CDWC,CAACxK,ECXE,ADWA,AdTd,EeFgB,CfEhBsP,EcSmB,IAAI,CAAC9E,AdTxB,IcS4B,EAAExK,EAAE,EAAE;IZrB/B,EYsBE,ECXEwK,EDWE,CAACA,AZtBAqI,CaWC,GAAG,ADWA,CZtBC,CAAChP,CYsBC,EZtBE,CaWC+G,AbXA,CYsBC,AZrBfyC,IAAI,CAAEmF,QAAQ,IAAK,UaUQ,CAAC1H,UAAU,CAAC;IDY1C,CAAC,CZrBG,IaUEC,AbVE,CYqBD,AZrBEyH,IaUE,EAAE,EbVI,CAACQ,EAAE,EAAE,GaUC;MDYrB,EZrBI,EaUAhP,ADWA,CAACwG,GZrBK,CaUD,ADWA,ECXE9H,CDWC8H,AZrBE7D,IYqBE,CZrBG,CAAE,WaUF,CAAC7C,QAAQ,CAAC,UbVsBD,GAAI,EAAC,CAAC;IYsB3D,EZrBI,EaUA,CAAC,CAAC;IDYN,ECXE,AbVE,EYqBA,CAAC+H,IZrBM4G,EYqBA,CAAC,CAAC,IZrBM,CAACyC,IAAI,CAAC,CAAC;EYsB5B,EZrBI,CAAC,CaUD,AbVE,CACD5H,IAAI,CAAErI,IAAI,IAAK;EYsBpB0I,ICZI,AbTE2E,MaSI7H,IAAI,AbTE,CaSDF,AbTEtF,GYqBC0I,CAAClD,AZrBE,CAAC0K,GYqBC,ECZE,ADYA,CCZC,AbTE,CAAC;IYsB3B,AZrBE,CAAC,CAAC,CACDC,CaQCyF,ADYA,CAACpQ,GCZG,AbRA,CYoBC,AZpBCnJ,CaQA,EDYEmJ,EZpBG,EaQC,ADYA,EZpBI;IYqBpB,EZpBIpJ,EaQAX,ADYA,CAACmL,IZpBM,CAAC/J,CaQD,ADYA,CAAC,CCZCsb,ADYA,EZpBI,CAAC9b,KAAK,CAAC;EYqB1B,ICZI,AbRED,CaQD,CAAC,KbRO,CAACC,KAAK,CACV,2CAA0CwC,GAAI,qBACjD,CAAC;EYoBPsW,ICbI,AbNE9H,MaMIlO,IDaIgW,AZnBE,CYmBF,AZnBG,EYmBA,AZnBE,CAAC,IaME,GAAGzX,kBAAQ,CAACuB,eAAe,CAAC,CAAC;IDcjD,AZnBE,CAAC,CaMD,AbNE,EYmBA,CAACiI,GCbG5H,MDaM,CAACmM,KAAK,CAAC,CAAC,CCbC,GAAG/N,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;EbLzD,EYmBEvD,ECbE,GDaG,CAACsa,eAAe,CAAC,CAAC;AZlB3B,EYmBE,ICbI,IAAI,CAAC+B,WAAW,CAAC,CAAC;AbNvBza,EYqBC,ICdI,CbPL,CYqBO2X,AZrBPlI,SAAA,GAAAA,IYqBuBkI,CAAA,EAAG,EZrB1B;IYsBG,ECdE,IAAI,ADcA5P,CCdC4S,GDcG,GAAG,MAAMxS,KCdK,CAAC,sBDcO,CAACO,cAAc,CAAC,CAAC;IACjD,ICf2B1K,ADevB+J,IAAI,EAAE,CCfwB,EAAE2S,WAAW;MDgB7C,EChB+CvC,IAAI,ADgB7ChQ,EChB+C,0BDgBlC,CAACM,UAAU,CAACV,IAAI,CAAC;IACtC,ECjB8D,CAAC,CAAC;EDkBlE,ICjBI;EDmBJ0P,IClBI,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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 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 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 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 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', function (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 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 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 { 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 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.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 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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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 userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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 1cd4e04..4b061d8 100644 --- a/dist/theme.7fcc2895.css +++ b/dist/theme.7fcc2895.css @@ -84,7 +84,7 @@ video { padding: 0; border: 0; font-size: 100%; - font: inherit; + font-family: inherit; vertical-align: baseline; } @@ -137,25 +137,25 @@ html * { } :root { - --primary-color: #393E46; + --primary-color: #393e46; --secondary-color: #222831; --secondary-color-lighten-20: #4c596d; --secondary-color-lighten-40: #7b8ba4; - --tertiary-color: #EEE; - --error-color: #EF4040; - --bg-color: #FAFAFA; + --tertiary-color: #eee; + --error-color: #ef4040; + --bg-color: #fafafa; --text-color: #333; --text-color-lighten-20: white; --icon-color: var(--primary-color); - --light-text-color: #FFFFFF; + --light-text-color: #fff; --button-primary-color: var(--primary-color); - --button-primary-bgcolor: #FFFFFF; + --button-primary-bgcolor: #fff; --button-secondary-color: var(--text-color); --button-secondary-bgcolor: $bg-color; --border-color: #d5d8dc; --border-hover-color: #9ca3af; --border-focus-color: #808998; - --box-shadow-color: rgba(196, 204, 213, 0.7490196078); + --box-shadow-color: rgb(196 204 213 / 74.9%); --box-shadow-modal-color: #444; --modal-header-bg-color: var(--primary-color); } @@ -169,18 +169,18 @@ html * { --tertiary-color: #d1d1d1; --error-color: #ff6b6b; --bg-color: #121212; - --text-color: #FAFAFA; + --text-color: #fafafa; --text-color-lighten-20: white; --icon-color: var(--text-color); - --light-text-color: #FFFFFF; - --button-primary-color: #ffffff; + --light-text-color: #fff; + --button-primary-color: #fff; --button-primary-bgcolor: var(--primary-color); --button-secondary-color: var(--text-color); --button-secondary-bgcolor: var(--bg-color); --border-color: #9ca7b2; --border-hover-color: #d5dadf; --border-focus-color: #f2f4f5; - --box-shadow-color: rgba(40, 48, 57, 0.7490196078); + --box-shadow-color: rgb(40 48 57 / 74.9%); --box-shadow-modal-color: #444; --modal-header-bg-color: var(--bg-color); } @@ -636,7 +636,7 @@ button i { opacity: 0.7; } } -@keyframes changeColor { +@keyframes change-color { 0% { background-color: blue; } @@ -712,7 +712,7 @@ a { } #chat-header { - border-bottom: 1px solid #cccccc; + border-bottom: 1px solid #ccc; z-index: 4; } #chat-header .button { @@ -758,11 +758,13 @@ a { top: 0; right: 0; } + /* Styling for user messages */ /* Styling for system messages */ .assistant-chat-message { margin-bottom: 0.5rem; } + #chat-form { flex: 0 0 60px; /* fixed height */ display: flex; @@ -882,7 +884,6 @@ aside { top: 0; left: 0; color: var(--bg-color); - background-color: var(--text-color); width: calc(100vw - 2rem); z-index: 30000; background-color: var(--bg-color); diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index a945428..5232c6c 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/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"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAiFE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;ACrIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;ACxCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EACE;;;AAOF;EACE;;;AC7BF;EACE;EACA;EACA;EACA;;;AAMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvBF;AACA;EACE;EAEA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;;;AAGF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;EACA;;AAGF;EACE;EACA;;;AAKJ;EAEI;IACE;IACA;;;AAKN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AChIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;;;AAGF;EACE;EACA;;;AChDF;EAGE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAKF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;ACzCF;AACA;EAEE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EAGA;AAYA;AAAA;AAAA;AAAA;AAAA;;AAVA;EACE;EACA;;AAGF;EACE;EACA;;AAUJ;EAGE;;AAOF;EACE;EACA;EACA;EACA;;AAIA;EACE;;AAIJ;EACE;;;AC3DJ;EACE;EACA;;;AAGF;EACE;EACA;EAEA;;AAEA;EACE;EACA;;;AAaJ;EACE;;;AAGF;EACE;;;AAGF;AAcA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;;AC1DF;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;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AC3EJ;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC1BF;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAEA;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC1BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAQJ;AAKA;AACA;EAIE;;ACxCF;EACE;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACjCF;EACE;;AACA;EAEE;;;AAQJ;EACE;EAEA;;;AAGF;EAEE;;;ACpBF;EACE;EACA;EACA;EACA;;;ACJF;EAEE;EACA;EACA;EACA;EACA;;;ACNF;EACE;;;AAGF;AACA;EAGE;EAEA;EACA;EAMA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;;;AAGF;EACE;EACA;EAGA;;;ACtCF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE","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-size: 100%;\n font: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\n}\n","// Light theme as default\n:root {\n --primary-color: #393E46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{lighten(#222831, 20%)};\n --secondary-color-lighten-40: #{lighten(#222831, 40%)};\n --tertiary-color: #EEE;\n --error-color: #EF4040;\n --bg-color: #FAFAFA;\n --text-color: #333;\n --text-color-lighten-20: #{lighten(#eee, 20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #FFFFFF;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{lighten(#393e46, 60%)};\n --border-hover-color: #{lighten(#393e46, 40%)};\n --border-focus-color: #{lighten(#393e46, 30%)};\n --box-shadow-color: rgba(196, 204, 213, 0.7490196078);\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: #{lighten(#1c2025, 20%)};\n --secondary-color-lighten-40: #{lighten(#1c2025, 40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --text-color: #FAFAFA;\n --text-color-lighten-20: #{lighten(#FAFAFA, 20%)};\n --icon-color: var(--text-color);\n --light-text-color: #FFFFFF;\n --button-primary-color: #ffffff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{lighten(#4f5b66, 30%)};\n --border-hover-color: #{lighten(#4f5b66, 50%)};\n --border-focus-color: #{lighten(#4f5b66, 60%)};\n --box-shadow-color: rgba(40, 48, 57, 0.7490196078);\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 //margin-top: 0.5em;\n //margin-bottom: 0.5em;\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.col {\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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 //content: \"\\2699\"; // Gear\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n //content: \"\\00D7\"; /* Unicode for ✖ */\n // content: '\\274C'; // ❌\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\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\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n","/* Styling for lists */\nul {\n //background: white;\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\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 // font-weight: 500;\n //border-bottom: 1px solid #ececec;\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 // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n //@extend %box-shadow;\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 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}\n\nbutton {\n padding: 0.75rem 1rem;\n border: none;\n // border-radius: var(--border-radius);\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n\n // @extend %box-shadow;\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 //color: var(--button-primary-color);\n //background-color: var(--button-primary-bgcolor);\n}\n\n.button-primary:hover {\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\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 50% {\n transform: scale(1.3);\n opacity: 0.7;\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 changeColor 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes changeColor {\n 0% {\n background-color: blue;\n }\n 33% {\n background-color: red;\n }\n 67% {\n background-color: green;\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",".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 //padding: 20px;\n //border-top: 1px solid #ccc;\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 #cccccc;\n @extend %box-shadow;\n z-index: 4;\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 .button {\n //padding: 0.25rem;\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 .chat-message-text {\n // color: var(--text-color-lighten-20);\n }\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\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\n.list-item.selected {\n background: var(--white);\n @extend %box-shadow;\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n}\n","#chat-title {\n @extend %font-weight-boldest;\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n // NOTE: This should be the same as chat-header border-bottom\n border-right: 1px solid #cccccc5e;\n\n min-width: 200px;\n max-width: 480px;\n\n //flex: 0 0 250px; /* fixed width */\n\n //background-color: #E3F2FD;\n //border-right: 1px solid #cfcfcf;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n // TODO: Animations\n // transition: display 0.4s;\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n max-width: 0;\n display: none;\n\n //flex: 0 0 0px; /* Collapsed state with zero width */\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\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 background-color: var(--text-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n @extend %box-shadow-modal;\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-message {\n}\n\n.notification-error {\n background: var(--error-color);\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/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"],"names":[],"mappings":"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ACE;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;;;AC1BF;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;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AClCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;ACJF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EACE;;;AAGF;AACA;EAIE;EACA;EACA;EAMA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;;;AAGF;EACE;EACA;EAGA;;;ACtCF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE","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-size: 100%;\n font-family: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\n}\n","// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{lighten(#222831, 20%)};\n --secondary-color-lighten-40: #{lighten(#222831, 40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --text-color: #333;\n --text-color-lighten-20: #{lighten(#eee, 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: #{lighten(#393e46, 60%)};\n --border-hover-color: #{lighten(#393e46, 40%)};\n --border-focus-color: #{lighten(#393e46, 30%)};\n --box-shadow-color: rgb(196 204 213 / 74.9%);\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: #{lighten(#1c2025, 20%)};\n --secondary-color-lighten-40: #{lighten(#1c2025, 40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --text-color: #fafafa;\n --text-color-lighten-20: #{lighten(#fafafa, 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: #{lighten(#4f5b66, 30%)};\n --border-hover-color: #{lighten(#4f5b66, 50%)};\n --border-focus-color: #{lighten(#4f5b66, 60%)};\n --box-shadow-color: rgb(40 48 57 / 74.9%);\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 //margin-top: 0.5em;\n //margin-bottom: 0.5em;\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.col {\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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 //content: \"\\2699\"; // Gear\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n\n //content: \"\\00D7\"; /* Unicode for ✖ */\n // content: '\\274C'; // ❌\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\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\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\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: 1px solid #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 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}\n\nbutton {\n padding: 0.75rem 1rem;\n border: none;\n\n // border-radius: var(--border-radius);\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n\n // @extend %box-shadow;\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 //color: var(--button-primary-color);\n //background-color: var(--button-primary-bgcolor);\n}\n\n.button-primary:hover {\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\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",".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 //padding: 20px;\n //border-top: 1px solid #ccc;\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 #ccc;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\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\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","#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","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n\n // NOTE: This should be the same as chat-header border-bottom\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n\n //flex: 0 0 250px; /* fixed width */\n\n //background-color: #E3F2FD;\n //border-right: 1px solid #cfcfcf;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n // TODO: Animations\n // transition: display 0.4s;\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n max-width: 0;\n display: none;\n\n //flex: 0 0 0px; /* Collapsed state with zero width */\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\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-message {\n}\n\n.notification-error {\n background: var(--error-color);\n}\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js index 7662b7c..a4b2c63 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 + ':' + "49208" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "50064" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/js/ChatArea.js b/js/ChatArea.js index 7732374..2589e53 100644 --- a/js/ChatArea.js +++ b/js/ChatArea.js @@ -59,21 +59,33 @@ export class ChatArea { let next, previous; if (event.key === 'ArrowDown') { - next = this.currentMessage ? this.currentMessage.nextElementSibling : this.chatHistory.firstElementChild; + next = this.currentMessage + ? this.currentMessage.nextElementSibling + : this.chatHistory.firstElementChild; if (next) { - if (this.currentMessage) this.currentMessage.classList.remove('hover'); + if (this.currentMessage) + this.currentMessage.classList.remove('hover'); next.classList.add('hover'); this.currentMessage = next; // Update currentMessage - this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view + this.currentMessage.scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + }); // Scroll into view } } else if (event.key === 'ArrowUp') { - previous = this.currentMessage ? this.currentMessage.previousElementSibling : this.chatHistory.lastElementChild; + previous = this.currentMessage + ? this.currentMessage.previousElementSibling + : this.chatHistory.lastElementChild; if (previous) { - if (this.currentMessage) this.currentMessage.classList.remove('hover'); + if (this.currentMessage) + this.currentMessage.classList.remove('hover'); previous.classList.add('hover'); } this.currentMessage = previous; // Update currentMessage - this.currentMessage.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Scroll into view + this.currentMessage.scrollIntoView({ + behavior: 'smooth', + block: 'nearest', + }); // Scroll into view } }); } diff --git a/screenshots/chat-collapsed.png b/screenshots/chat-collapsed.png index 9882d987daa342440ce29688650cd26874786546..3aea65066a223fc4036d2cb8d2d90e3a765a0705 100644 GIT binary patch literal 40161 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 literal 47800 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 Uof?C+IC*oK6AH%@j%wfhA9hgAUH||9 diff --git a/screenshots/chat.png b/screenshots/chat.png index 3eeaaa0efe05d62d6f2608c02cf9da258d5666b7..47bcd77c21dbb9244df8564b73b535ca4b8b3eea 100644 GIT binary patch literal 42563 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 UriKN*$-R@8Q$Cq=!r;#T0xnsB4FCWD literal 50847 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Ť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 { const uri = req.url === '/' ? '/index.html' : req.url; @@ -32,7 +32,7 @@ const server = http.createServer((req, res) => { }; const contentType = mimeTypes[extname] || 'application/octet-stream'; // Validate mime type exists - const invalidMimeType = !mimeTypes.hasOwnProperty(extname); + const invalidMimeType = !mimeTypes[extname]; // Validate URL // Allows: alphanumeric characters, hyphens, underscores, and exactly one dot in the extension const isValidUri = /^\/?[a-zA-Z0-9_-]+(\.[a-zA-Z0-9]+)+$/.test(uri); From bf51501f8c72d4f59036e0e28a4ccc0de97afcec Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Sun, 7 Jan 2024 16:19:52 +0200 Subject: [PATCH 3/5] Run linters --- css/colors.scss | 4 +++- css/theme.scss | 1 - dist/script.d573be0b.js | 2 +- dist/script.d573be0b.js.map | 2 +- dist/theme.7fcc2895.css | 13 +++++-------- dist/theme.7fcc2895.css.map | 2 +- dist/theme.7fcc2895.js | 2 +- dist/theme.7fcc2895.js.map | 2 +- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/css/colors.scss b/css/colors.scss index 46aac5a..d115e9d 100644 --- a/css/colors.scss +++ b/css/colors.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + // Light theme as default :root { --primary-color: #393e46; @@ -15,7 +17,7 @@ --button-primary-bgcolor: #fff; --button-secondary-color: var(--text-color); --button-secondary-bgcolor: $bg-color; - --border-color: #{color.adjust(#393e46, 60%)}; + --border-color: #{color.adjust(#393e46, $lightness:60%)}; --border-hover-color: #{color.adjust(#393e46, $lightness:40%)}; --border-focus-color: #{color.adjust(#393e46, $lightness:30%)}; --box-shadow-color: rgb(196 204 213 / 74.9%); diff --git a/css/theme.scss b/css/theme.scss index f875c75..864cafb 100644 --- a/css/theme.scss +++ b/css/theme.scss @@ -26,4 +26,3 @@ @import 'Sidebar'; @import 'DropDownMenu'; @import 'UINotification'; -@import 'CopyButton'; diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index 2a3da09..de1f5db 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -2086,7 +2086,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 + ':' + "50064" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "50342" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/script.d573be0b.js.map b/dist/script.d573be0b.js.map index e8a20f9..6aba773 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/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","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","name","create","save","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App"],"mappings":";;AgCAA,IAAA6e,IAAA,GAAAhV,OAAA;AACA,IAAAwB,KAAA,GAAAxB,OAAA;AACA,IAAAkB,YAAA,GAAAlB,OAAA;AAEA;ADJA,ArBAA,AoBAA,ADAA,AhBAA,AFAA,AeAA,AEAA,AXAO,AZAA,AFAA,AgBAA,ALAP,AFAO,AQAA,AlBAA,AyBAA,ALAA,AhBAA,AeAP,AGAA,ANAO,AOAP,ATAA,AhBAA,AIAO,AGAP,AEAA,ADAA,AOAO,AQAP,AtBAO,A+BKP,IDLA0O,ArBAAnN,AoBAAa,AjBAAb,AFAAa,AeAAA,AEAAb,AdAAC,AUAA2M,ACAAM,ATAAzI,ATAAjG,AEAAgB,ADAAA,AeAAQ,ENAa+G,AZAAnL,AFAAhB,AgBAA+P,APAAjJ,AQAAsJ,AlBAA/Q,AyBAAgU,ALAApC,AhBAAjO,AYAA6J,AHAAjD,AdAAvM,GEAG,AWAhB,AUAA,AxBASrD,AIAOwG,CMAhB,AGAA,AeAA,AzBAiB,AmBAA,AGAjB,AFAA,CrBAkB,AoBAA,CRAlBqD,AZAmB,AsBAnBA,CdAAA,AGAAA,AeAAA,AHAAA,ATAA,ATAA,AgBAAA,ClBAqB,AIArB,ADAA,APAqB,CIAC,AsBAA,ATAA,AjBAA,A+BKPhI,CfLQ,AUAA,ArBAA,AYAA,AFAvBgI,ATAAA,CUAwB,ALAA,ANAA,AFAArD,AKAxBqD,ADAAA,CsBAA,AnBAA,AeAA,AdAyB,AQAA,AhBAApD,AWAA,CgBAzB,AjBAA,AMA0B,AIA1B,AxBAmBzG,AeAO,CLA1B,AGAA,AeAA,ATA2B,AMA3B,AzBAoBC,AuBApB,COAA4J,AnBAAA,AeAAA,APA4B,CYA5BA,A3BA6B,CYA7B,AhBAuB,AOAvB,CHA+BnD,AKA/B,ADAA,CRAyB,AgCKA7E,CAAA,EFLzB,AnBAA,AeAA,AtBAmC,A4BKP,CDL5B,C3BAqC;A2BCrC,ArBAA,AoBAA,ADAO,AhBAP,AFCO,AeDP,AEAA,AdAA,AOAO,AGAP,ACAA,ATAA,ATAA,AEAA,ADCO,AeDP,ENAErB,AZAAA,AFAA,AgBAAA,APAAA,AQAAA,AlBAA,AyBAAA,ALAAA,AhBAA,AYAAA,AlBAA,AIAA,AWAA,AdAA,A+BKA,EDLF8K,ArBAAD,AoBAAD,AjBAAyC,AaAAzC,AEAAa,AdAAlB,AUAAK,ACAAmN,ATAAnN,ATAAtB,AEAAiB,AcAAO,EMAauO,AlBCA3N,AUDA2K,ArBAP3W,AIAAyG,AICOkE,EwBILG,CtBLR,APAS/E,ADAAX,AIAAsC,CwBAT,AJAA,AFAA,ARAA,AhBAU,CqBAQ,CXAlBiC,AWAmB,CUAnB,ADAAA,AJAAA,ATAarJ,AZAAA,AcAAA,APAAA,AQAAA,AOAAA,ALAAA,AEAbqJ,ANAarJ,AFAbqJ,AhBAa,AIAA,AmBAb,CMAqB,AZAR,AZAC5C,AcAD,APAC8F,AQAD,AOAC7G,ALAAgR,AJAD,AlBAC,C6BAQ,A3BAP5R,AKAf,CwBAAuE,AdAgB,AEAA,ALAhB,AMAgB,AlBAAtE,AIAA,AYAA,ATAhB,AcAAsE,CVAA,ALCwB,CGAC,AiBDzB,ArBAAA,AyBKY,CtBLZ,ACC0B,AGD1BA,ARAmB,AmBAnB,AhBAAA,AuBKahI,CFLb,AjBAAgI,AaAA,ArBAoB,AFAA5D,AGAA,AkBApB,ARAA,CYAA4D,AzBAqB3D,AwBAA,CtBACgB,AOAA,AaAtB2C,CMAA,AJAuB,AJAvB,CXAwB,CVAC,AoBAA,AfAzB,COAA,ALAA,ADCiCE,CKDjC,AXA2BvE,AoBAA2R,CMA3B,AzBA4B,CsBA5B,AOKuB,C7BLO,A6BKN,CAAC,CVLO,EjBAE,AHAA,AoBAA/K,EjBAEjF,AHAA,MoBAM,EAAE,EjBAE,AGCJ,CAAC,CHDK;A0BChD,ArBAA,AoBAA,AjBAA,AaAA,AECO,AdAA,AUDP,ACAA,ATAA,ATCO,AEAA,AcDP,EMAE3G,AlBCAA,ALDA,AeAAA,ArBAA,AICA,AIAA,AODA8C,AdAA,A+BKA,EDLF8H,ArBAAL,AoBAAmP,AjBAApM,AaAAwK,ATAItX,AZAA,AFAAkF,AgBAAlF,APAA,AQAA,AlBAAM,AyBAA,ALAA,AEAJ2W,ANAI,AOAJO,ATAAnN,AOAAqM,CRAKpU,CaCQiW,AdAAzK,APAA/E,AEAAiB,AMDPvJ,CfAC,CKAC,AOAA,AQAA,AOAA,ALAA,AJAA,AcKAoJ,C3BLC5D,AOAA+F,AQAAqJ,AOAAnQ,ALAAnF,AhBAAqH,AYAA0K,AFAT,AZCS,AWDA,AdAAxP,C8BAT,ALAA,AxBAU,AOCO,CNDN,ADAA/B,AsBAX,AxBAWpB,AeAAoD,CEAC,AdAAT,AgBAA,AHAZ+G,AhBAY,ACAAvG,C8BAZuG,AFAarJ,AlBCAA,AeDbqJ,ATAatI,AEAAA,AEAAf,ApBAAiB,C6BAb,ADAa,AlBCC0J,AUDArK,AGAd+I,ADAA,CKCsB,AvBDP,AoBAf,AzBAe,AOCO,ACAPhI,CEDf,AmBAgB,AhBAhB,AeCuB,ADDP,ArBAAuG,ANAA,AOCO,AQDP,AdAA,C6BAhByB,AxBAiBZ,AiBAjBY,CZCkB,ANDA5C,AOAA,AUAA,AGAlB4C,AzBAkB1J,AICAyG,AWDA,AdAArD,CSAlBsG,AGAAA,AcAmB3D,ANAA,ALAnB,AhBAmB,ASCO6D,CsBD1B,ApBCoBoC,AeDpB,CvBAqB,ASAAnL,AUAAA,ADAA,AGArB,CrBAsBmC,AHAAlD,CoBAC,AnBAA,C6BAvB,AzBAwB,AaAA,AKAxB,CTCgC,ARDP,AmBAzB,AzBAyB,AQCA4B,APDA,CSAzB,AGAA,ACCiC,AMDP,AOAA,A3BAAzB,AQCD,CNDE,AIAA8H,AYAA,CPCC,ARDA,ADAA3C,AMCA,CSDC,AdAA,AgBAA,APAA,AUAA,AlBCAqB,COACwF,AMDA,AEAA,APAAa,AUAA9L,AlBCD,CcDE,ClBAC,AICO,A4BIpB,CAACU,ChCLc1B,CAAC,EiBAE,AdAA,AgBAA,AjBAA,AFAA,CWCC,ARDA,AGAA,CWAC,AEACqB,AjBAAA,AFAD,ASCJ,CEAK,ALDA6G,AGCJ,GWDO,AYKb,CbLe,AjBAA,AoBAD,AUKb,CVLc6O,AUKb,CpBLc,CAACnK,COAG,AjBAA,CeADvL,CXAC,EAAE,EWAE,CLAC,CKAC,ALAA,AUAA,CAAC;ASCzD,ArBAA,AoBAA,AjBAA,AaAA,AFCO,ACDP,ATAA,AOCO,ASIP,EJJEhB,AdAAA,AIDA,AXCAA,AEAA,EsBDFyb,ArBAA3Q,AoBAA6O,ADAI,AhBAJ9O,AFCI,AeDJ4M,ArBAI,AFAA,ASAA,AQAA,AOAA/R,ALAA,AhBAAnE,AeAA,AIAJkW,ATAAhM,AhBAI,AIAmC,AICnC,AODA,AdAA,EgBAE,AEAA,AjBAAzG,AsBCO0S,ADAAP,EQDb,AFAQ,AlBCA,ANDA,AOAA,AQAA,AEAA,ADAA,AZCA1M,AMDA,AdAA,C4BAC6O,AhBAT,AFCS3O,ANDAjE,AOAAgG,AQAAoJ,AEAAa,ADAArW,CrBACT,AQCA,CuBDVwJ,ALAA,AvBAW,AwBAA,ArBAA,AmBAX,CZAAA,AcAYyP,ArBAA9W,AiBCO,CbDnB,ACCa,AiBAAhC,AdAAA,AZDA,AEA0ByB,AGC1BzB,AgBAO,CODpB,AJAAqJ,AECa,AdAA,AZDCrI,AoBAA,ADAA,AIAdqI,AzBAc,AOCAlE,ACAA,CLDC,AKCAsD,CEDfY,ACCgBsB,AiBAA,AdAA,AUAO,CMDvBtB,ARAiBsN,AhBAA,AeAArW,AGCO,AxBDPb,AIAsB,C2BAvC,AzBCO,AUDP,ATCkB,AEAAgL,CIDlB,AXAmB,AOCAtF,CoBDC,AlBCA,ACDA,AVAAF,AFAA,AIAmBvD,AGCnB,CmBDpB,ArBAqB,AsBAA,AFArB,ATAA2H,AhBAqBvJ,CoBAC,AEAA,ADAA,CXAtB,AmBAuBU,AjBAA,AHCA,ADAA,CsBDvB,AzBAwBkG,AsBAA,AnBCA,CYDClG,AXCA,CPDC,CUAC,AVAA,CyBAC,AXA5B,CZAuC,CAAAZ,CyBAR,A7BAA,C6BACe,A7BAAhB,CoBAC,ApBAA,AQCA,CYDC8M,ApBAA,CQCC,CHDC,ADAG,EAAN9K,IAAI,IyBAS,CAAC,EzBAVC,CgBAa,AZCA,CYDC,AdCZiG,AEAY,GJDd,CgBAkB,AhBAlBpG,CgBAmBoU,GhBAnB,EyBAwB,AvBCX,CuBDY,AzBAzBhU,IAAA,IgBAiC,CAAC,ChBAlCA,IAAA,EEC6B,CFD7BJ,GECiC,CAAC2F,AFDlC,EAAAvF,IAAA,CEC0C,GAC3E,CAAC;AyBDL,ArBCO,AoBDP,AjBAA,AaAA,ADAA,ATAA,AgBMAR,E7BNE,AqBCArB,ANAA,AVAA,AeAA,EQDF0b,ADAA9B,ADAI,AhBAJnO,AFCI,AeDJuM,AECI,AvBDA,ASCA,AFDA,AQAA,AlBAA,AyBAA,ALAA,AhBEA,AeFA,AIAJlN,ATAAwE,AhBAI5P,AOCA8J,AEAArE,CPDC,CQCQ4F,AODP,AEAA,AjBAA,AED2BpJ,AWC3B,AdAA,E4BAE,AlBCA,AiBAA,AvBDA,ASCA,AFDA,AQAA,AOAA,ALAA,ADAA,AHCA4Q,AlBDA,ASCA,CoBDCgH,AlBCA5N,AiBAAqN,AvBDApS,ASCA2H,AFDA5B,AQAAoJ,AOAAjK,ALAAF,ADAA0K,AZCA1R,AcAAyQ,CNDCrU,AEAAA,AbEA0H,AFH2B,AGE3B,AyBKA,ChCNC,AID0B7G,AGE1B4H,AyBKA,CDNX,AbCY8I,AlBDA7S,AeAAsD,AdAAA,A+BMA,CFNZ,AVAa,AICAhD,ANAAgE,AODb,ATAA,AgBMawJ,CZNC,ACAA,AGCAjB,CODdlD,ALAA,ATAe,AEAA,ALCA,AMDA,AhBDsB,AKEtB,AcAA,CODfA,AbAgB/B,AEAAA,ADCA,AODhB+B,ATAAA,AhBAgB,CWCC,AWDA,ADAA7I,AdCA,AyBKA,CnBNjB,AaAA6I,AZCkB7I,ARCA,AYDA2E,AXAA,AEAA,AcAA,ASKA,CtBLQ,ANFWzD,CMEV,ACAPiK,AWDAC,AtBAA,AuBCA,CMDC,AhBArBvC,AeCqB,AvBDA,ACEC,ANFD,C+BArB,AdAsB,AEAA,AKCA,ANAA,AXAA,AEAA,CqBDtB,AbAuB/G,AEAAA,AMAvB,ATAA,APCuBnC,AMDA,AdAA,C4BACK,ADCA,AvBDA,AmBCAmX,ANAAnF,AXAArN,AyBKA,CNNxB,ALAyB,ArBAAzF,ASCA,CKAC,AODAiB,ANAAP,AdAAA,CaCCgC,AaDA,CdA3B,AFC4B,ANDA,AsBAA,ALAA,AlBDS,AGET,CFDC,AsBAA,A3BAA,AIDQP,AGER,CFDC,AOAA,AGAA,AdAA,CWAC,AGAAxB,AdAAA,C4BAC,AZAA,AEAA,APAA,AZAAR,C6BACc,AZAA+Q,AEAAA,AfDI,CwBEH,AVAA,EAAEe,AlBDA,CwBCC,EAAE,CVAC,ARCA,AeFA,ANAA,AdAA,CgBAC,AEAA,ALCA,AODA,ANAA1P,AdAAA,CgBAC,AEAA,CDCC,CZCC,CAACqE,AeFA,AHCAsL,CGDCpS,ANAA,AdAA,C4BAC,AdAA,AdAA,C4BAC,GRAG,AHCA,CZCE,AeFD,CHCC,CZCC,CWFC,CAAC,CHCC,CGDC,AHCA,CKDC,CAAC,EAAE,CUAC,CAAC;AEChE,ADCO,AjBAA,AaAA,ADAA,ATDP,ENCE,APAA,ASDA,AQAA,AlBAA,AyBAA,ApBCA,ACCA,AeAA,ASIA2b,EDNFxQ,AFAI,AlBCA,AiBAA,AvBDA,ASCA,AQDA,AhBEA,AeFA,AGCA,ANAA,AFDJ8D,AhBAI7P,AIFiC,AKGjC,EqBASma,AjBAAtM,AaAAqL,ADAAX,AVDPhV,AdAAA,E4BAE,AlBCA,AiBAA,AXDA,AZAA,AcAA,ALCA,AQDA,ADAA,AGCA,AxBDA,C6BACuW,AlBCA5Y,AiBAA8E,AvBDAiB,AFCAhB,AWAAmG,AQDAC,ADAAvJ,AGCAoV,ADCAlU,CjBACiF,AYDAzB,ATAA,AuBKL,ChCNMxH,AgCMLwc,GFLe,AjBAA,AIDPtK,ARCAvH,AuBKL,CtBLMW,AoBAO,AjBAA,ASDP,AtBAA,AQEAV,AeAA5G,ASIL,CrBLM,AiBAA,ANDA,ACED,ASIJ,CVNM,AJCA,CaDjB,APCkB,AxBDAhE,AeAA,AQEA,AtBFA,C4BAC,AlBCAc,AiBAAA,AvBDA,AUAA0C,AdAAA,CECCyC,AkBDA,AHCA,AOAO,CMD3B0D,A5BCqB3D,AGCA,AkBDA,CKDClF,AxBAAmG,ALAA,CqBAC,ArBAA,C0BCQ,ApBCP,AUFxB,AhBAwB,CUCCqE,AcAAyL,CdAC9L,AKDA,AdAA,CUCC,AiBAA,AdAA,AODA,ALA3BtB,ADA2BpI,AdAAA,C8BA3B,ApBEON,AiBDqBA,AXDA,AdCA,AWAA,ARCA,AeFA2V,CPCC,ARCA5N,AmBDO2N,AjBCP/L,CEDC,AmBDA,A1BCA,AKCA1F,AOFA,AdAA,C4BACjE,AZAAK,CPCCmE,ALDA,AUAAnC,AdAAA,CyBCQqT,ALDP,CAACjU,ALAlC,CQC6B,CdAO,AODA,AOCNmK,AhBCM,CSFCjF,AXEA,CIDC,AJCA,AGDb,ADCa,CCDZnC,EgBAe,CdCpB,AiBDqB,AHAA,CdCpB,AiBDqB,AXDA,ARCb,AMDa,AdAA,CgBAC0M,AOCN,AfAP,AMDa,AdAA,C4BAC,AHCA,AjBAblI,CoBDc,AHCA,AFANwN,CHDO,CAAC,GZCV,CAAC,CAAC,EmBAe,CAAC,AXDA,CAAC,EYAE,CAAC,ALCd,CAACE,EHDgB,CAAC,IVEjB,CAAC,AaDO,CbEhDzW,AMH+D,AOCd,CPDe,AOCd,EAAE+W,IbE7C,CAACzV,QaFyD,CbEhD,AaFiD,CbEhD,IAAI,CAAC;AoBF9B,AfAA,AgBMA,CAAC,CFLClC,AjBAAA,AaAAA,ArBDA,ASCA,AFAA2M,AQAAoJ,AlBAA,AyBAAjK,AFAA9L,AzBDA,AOEA,AEDA,AuBKA,EDNF2b,ArBCInS,AmBDA,AlBGA,AiBFA,AzBAA9D,AmBDA,AhBEA,AeFA,AGCA,ARDJ8J,AZFI,AIIA,AOFA,AQEA,AtBFA,CcAC,AdAA,CmBCCuG,AFDgB5Q,AHAhB,AdAA,CmBCA,CSDE,AlBGA,AiBFA,AXDA,AEAA,AGAA,AhBEA,AeFA,AGCA,CKDCsU,AlBGA/T,AiBFAoG,ARAA,AlBAA5G,AoBDA0R,AhBEAjO,AeFAnG,AGCAsJ,CdAC,ANHAzF,CMGCoD,APAA,AKCA,AeAA5G,CpBDCP,C2BACtC,AjBAAA,AaAAA,AxBAAkF,AuBAAlF,AVDAmD,AdAAA,C6BCA,AjBAA,AaAA,ATDC2O,AEAA0D,AjBCAzQ,AuBAD,AVDC,AdAA,C8BAd,A3BFe,AGIA0D,ACAA,CsBDC,AjBAA,AFEA,AeFA,ADAA,AjBCAsB,AOFA,AdAA,CSCC,AMDjB,CeAAV,ArBCkBsB,ANHAtE,COKC,APLD,CyBEE,AFCAyF,ArBCA,AeFA,ALApBzC,CbCqB,AwBAD,ALDC,ADAA5G,CXCC,APAAF,AgBDA,AbEA,CuBFC/B,AlBGA,ACFAmM,AVAA,AyBAA,ApBCAlE,CGDCtD,ACEAvE,AMHA,ALCD,AUDC,AlBFA,AGIA8I,CwBFxB,A5BCyB,AgBDA1I,AjBCAmE,CCAC,ASAA,CgBAC,AXDA3E,AOCA,ARD3B,CNC4B,AkBAA,ANDA,ADAA,AGCA,AjBCA,CGDC,AkBAA,A1BAA,AsBAA,ADCV,CJFW,AZEA0H,AgBAVxE,CMFW,AlBGA,AQHA4D,AjBCA,AmBDA,CQAC3G,AlBGAyB,ERFE,AKCA,CSFC,AdCA,AICA,ACAA,CSFCzB,AMEV,CJFW,AEAA,AdEA,AgBAV,CJFWkR,GEAG,CAAC3Q,EbEE,CGCC,CkBHC,AlBGA,AUHA,AbEA0D,CqBFC,ARAA,CAAC,AEEV,CAAC,CNFW,AEAA,CFACgN,AEAA,CXEC,CAAC,QqBFQ,CAAC,ClBGC,CAAC,AQHA,CFAC,AEAA,CFAC,CAACG,SAAS;AcC5E,AfCO,EaDL,AxBCA,ASCAjG,AQFA,AECA,AxBDA,ASEA,ADAA,AeAA,EQFFoL,ArBCI,AoBAA,AjBAA,AFEA,AeFA,AEAA,AzBAA,ASAA,AQAA,AlBAA,AyBAA,ANDA,AHDuB,AOEvB,AlBCA,CWHwB,CZGtB,AUDOzH,AZHPnJ,AWEA/E,AdAAA,E6BCE,AjBAA,AFEA,AiBFA,AXDA,AZCAsF,AcDA,APCA,AVAAzB,AyBAA,ANDA,AdEA,AEAAsF,CqBDC2B,AjBAA3G,AFEAA,AeFA,AEAAqG,AhBAAS,AeAA9G,ANDA7E,AICA,AzBDAnB,AOEA+G,CGDCkE,AgBAA,ADAA,CtBAC,ADAA,CGAC9D,AcDA,AbEA,CDDA,AcDC4O,AHCO,AhBDP,AeAA,AdAA,C8BAb,ArBCc,ARAC,AcAM,ADDPjU,AdAAA,CSCCoI,AkBAA,AvBAA,AFAA,AICA,CMDC,AFEA,AiBFA,ADAA,ArBCA9C,CyBFhBuC,ApBGiB6B,AiBFA,A1BAAnG,AyBAAhE,CGAC,AlBAA,ARHA,AGIA2I,CGDC,AGAAlJ,ADAAoM,ARHAzG,AKIAuE,AMFA,AdAA,CSCC,AICAoB,ALAD,AMFC,AdAA,CSCC,AoBAA,AhBCD,ARAC,CKCC,ALDC,ACAD,AEAA,CKAC,CiBFvB,CDCyBiN,AnBEA,CCFC,AVAC,AEHD,CSGC,ADAClM,AaAD,ArBHA,CSGClM,AXAA,AmBDA,AICA,CdEC,AUHA,CVGCgK,AUHA,CTCE,CcAA,CAAC,ACAA,ChBEC,AgBFA,ChBECO,AQHA,APCE,CODDsK,IRGI,EEFE,CAAC,CMDC,CWCV,AHAW,CGAV,AXDW,CWCV,AHAW,GZDG,AdAA,EcAErS,AdAAA,C0BCC,AZDA,AdAA,CYCC,APCAuF,ASFA,AdAA,CYCC,EMDE,AQCA,CRDC,AQCAsD,IrBCK,EAAC,CAAC,IqBDI,CAAC,CAAC,CAAC;AIAxE,AFAA,A7BAA,AQEA,EoBDE,AzBAA,AmBAAG,ADDA,AGEAL,ARDA9L,AOEA,EQHF4b,ArBCI,AoBAA,AjBAA,AFEA,AeFA,ArBAA,ASCA,AMDApb,AlBAA,AyBAA,ArBCA,AYHA,AOEA,AlBCA,AEAA,AMFA,AdAA,EkBAE,APCAqM,ARHA5G,E0BGE,AjBAA,AFEA,AeFA,ATDA,AZCA,ASCA,AZDAd,AyBAA,ATFA,AOEA,AlBCA,CuBDC2U,AjBAApZ,AFEAgF,AeFAwS,AZCA3J,AaDA7I,ALAAyG,AGAA+L,AlBCAnQ,AgBCAqP,CXFC,AUAApS,AlBHA,AKIAkF,CGDCnJ,ARHA,CCGC,AeAA,AlBAA,CGAC6F,AeAA7F,AJAAf,AOEAoX,CNHCpF,AfCA7R,AcAD,AZHCwB,AmBKD,CTDE,CHCC,AGDAZ,AZDA,AyBAA,AXAA,AOEA,COFC,AjBAA,AFEAoE,AgBFApE,ALAA,CpBAC,AEHA,AGIA,AEAA,CsBFlB,ALCmB,AJAA,AGAA,ArBHA,C0BGC,AjBAAP,AWCAsL,CbCC,AaDD,AjBAC5D,AEAA,CsBFrBmB,ALCsB7I,ATDA,AQCAA,CDCC,CMDC6Y,AnBEA,CMHC7Y,AZCA,CECC,CFDC,AOAA,AHCA6J,CIDC,ADAA,CmBD5B,AlBC6B1J,AOAA,CMAC,ANAA,AKAA,CCACA,ADAAA,CXCC,CGFC,AHEA,AaDA,CVDCoO,AUCA,GPAG,ERAE,AQAC/N,CNCA,CFDC,CkBAT,AhBCU,CgBDT,AjBAU,CiBAT,AjBAU,AOAC,AOAD,CDAC,AdAA,AaAA,CCAC,AdAA8L,AeAA,AFAA,CRDC,CAAC,AHEA,AMDE,GXCZ,CkBDc,AlBCbxC,IkBDiB,CAAC4B,CVDC,CAAC,ELCE,CAACD,CaAC,CAAC,EbAE,AHCb,CGDc,AeAA,AlBCb,CiBDc,ACAA,CdAC,AaAA,ACAA,CdAC,AcAA,CdACrL,ADAA,AHCb,CAACT,CGDc0M,CHCZ,CAAC,EGDe,CCAC,ADAA,CAAC;AmBA/E,AFDCjK,ArBEAA,EoBCCmJ,AzBAA,AwBDA,ANAAlL,ANDA,AdAA,E8BAFgb,ArBCIhX,AoBAA,AjBAA,AaAA,APDA,AGCA,AhBCA,AkBAAA,ACDA,ATAA,AZHA,AGIA,AEAA,AcCA,CJHC,AfFA,COIqB1E,ANDpB,AcDA,ALEA,AFDA0M,AQAA,AlBAAzH,AgBFA,CWAL,ArBEA,CsBAO,ADFPiU,AhBEO,AFCoB,AeDpB,AECAtN,AXFAiG,AKCA,AhBCA,AmBDA,ATAA,ATCA,AEAA,ADDP3H,AeEO,COFCiP,AjBAAxN,AaAAA,AECD,AzBAClG,ADDA,AoBAAgR,AGAAuB,ATAAzI,ATCAlI,AEAA0C,AcCA,CZDqB,AGApB,AFDA,CgBCC,AdAAsE,AFDAzN,ALCA,CFDC,ACCA,AYHA4R,ChBEE,AICDvL,AiBCA,CZDqB,AJApB,AgBCA1D,CZDqBiH,CDD1B,AmBFR,AZCe,AZCA7D,AmBCP,COFT,ArBCU5B,AODOnC,AOEP+B,ACDO,ATAA,APCA,CFAC0B,CsBHjB6S,AlBGsC,AHDtC,CuBDDhQ,ADCoB,AnBCoBlJ,ARApByF,AGAA,AYHA,AOEApF,ATAA,APCA0J,AcCA,CbFN,ALAO,AFCAxE,AWAA,AZDAP,AoBAA,ADAAtE,AEEA,CbFN,AODO,AZCA,ASCA,AODD,AbApBwJ,AeEqB,COFC7J,AhBCA,AUAP,ANHO,CIECwE,AhBCA6C,AeDA,AGCP,ARDOuH,AOEA,CNHC0C,AfCA,CAAC3R,C6BD1B,AFDC,AhBE0B,AaAA,AdAA,CCAC,AaAA,AvBCA,ASDA,AVAC,AuBAD,AhBCA,CIDC,AaAA,ARFA,AOEAQ,CtBCC,ADDA,C4BAC,ARAA,CQACA,CZFC,AVEhC,CFCiC,AYHAiS,CREN,AODO,CXEC,ACAV,CGDIjI,AHCHjB,CKDW,AYCP,EZDS,AYCP,CdDC,AHCH,CGDI,CeAQ,AlBCV,CKDW,AYCP,ACDO,AlBCVxB,CKDW6E,AYCP8K,CMDQ,CAAC,AzBAA,CAAC,CaFC,AXGV,CWHW7T,AFEd,ATCI,CSDH,CAAC,ATCIwE,CWHW,EAAErD,AOEA,CAAC,GbAG,AMFA,CNEC8G,AMFA,CYEC,CAAC,CNCN,CZDQ,AYCPA,CZDQ,GYCJ,CZDQ,AYCP,CZDQ,CAAC,EYCL,CAAC,AjBAf,CiBAgB,AjBAf;AwBDrD,A/BAA,EUCE,AgBAA,APDA,AQEAD,AHAA,EOFF8P,ADCI,AjBAA/Q,AFAuC,AiBCvCA,AvBDA,AFCArF,ADDA,AoBAA,ADAA5E,AIAA,ATAA,AZFAwF,AGGA,AEAA,CEDwC,CGCtC,AFDAuG,AQAA,AdCAlE,AYHA,AKIA,EOFE,AbDAnI,AQCA,ATAA,CcAC+Y,ALAAnB,ATAAzM,CFCC,AFDA,ASAA,AdCA,CJAC,AWAA8C,AFDA1N,AUAA,ADAAA,AZCA,CNAC8E,AiBDAmQ,AFFA,CSGChK,AJCA,CIDA,ApBAC,CeDC,AfCAxE,AEAA,CQFC,AUEA,ALDA,AJFA,AdAA,AKGA0C,CQFCzJ,AKCA,AhBCA,AYHAoS,AFEA,AZFA1M,AGGA,AgBCA,CjBDC,ACAAU,CwBFlB,ANCmB,CTAC,CcAC,AbDA,CcArBwC,AdAsB3G,AQCAlC,AlBCA,CaDC,AbCA,CuBDCA,AdAA+M,AZFA,AGGA,AEAA,CLHC,CgBECvM,CjBCC,ASDA,ASAA,ClBCC,ASDA,ASAA,CUD5B,AjBE6B,CAAC,AWDA,CXCC,AMDA,AFFA,AOEAL,CKAC,AjBAf,AeCA,ARDe2G,AFFAJ,CYECvG,AjBAf2K,AeCAA,AXFe,CAAC0G,ALCA,EAAE,CSAC,ClBCC,AiBDA,CjBCC,AiBDAiE,ACACjV,AHFD,CNEC,CAACgM,AMFA2F,CDCC,ADCV,CCDW,ADCV,CKAY,ALAX,CSAW,CLAC,AKAA,CKAC,AjBAf,AeCA,ARDe,CUAC,AjBAf,AeCA,APDiB,CRAhB,AeCA,AVHe,CLEdnF,AeCAA,ChBDgB,AQAA,AFFAgF,CNECvG,AQAA4J,EPAb,AeCA,CfDElL,AeCAA,ChBDe,CAAC,ECAZ,AeCA,AHDc,CAAC,CbAC,AMFA,EYEE,AjBAb,AeCA,AhBDakC,AMFA6F,CYEC,EVAE,CRAC,AQAA,CRAC,CAAC,AMFA,CAAC;AaEtE,A/BAA,EUEE,AgBAA5G,APDA2J,AGAA,AEEAoC,AjBDA,AEAA,AMFA,AdAA,E8BAFkE,ADCI,AnBAA,ANCA,AFAA,AWAA,AZDAxa,AyBCA,ATHA,AOEA,ATAA,AZFA4E,AmBIA,CTDC,AIHA,CLEC,AeCA,AdAA,AFDA0G,AQAA,ACAA,AHFA,EYEE,AnBAA,AgBCA,ArBDYpE,AmBAZ,ATAA,CcACsR,AnBAArU,AgBCAA,AFDA2S,ATAA3S,CHAC,AeCA,AhBDA,AQAAsQ,ACAAhV,CRAC2J,AeCAA,AvBAA,AFAA,ASDA5J,AVAA,AEFA,CFECqE,CgBFC5D,CdAC+E,CMGC0E,AGDA,AeCA,AvBAAlE,AFAA,ADDA,AmBAA,CVAC,ATAA3B,AyBCA,ArBDY,AeAZnE,ALAA,CLACqB,AgBCAA,CdDCqI,AeCAA,AVHA,ChBEC,AmBAA,ALAAnK,CUCCsL,AxBDA,AsBEA+L,ANJA,CQGA,ANDC,AIED,CXFE,AeCA,AvBAA,C0BFtB,ADCuB,AJCA,ArBAA,AeDA,AIEA,CnBDC7Q,AcDAyO,AEAA,AjBFA,CMGCxK,ASDAyK,AfFArP,C2BCzBgD,ArBE0BlE,AoBDA3E,AnBAA,AgBCA,AFDA,CdAC+B,ACAA,AeCAA,AXDA,CJAC,AIAA5B,CSAC,CfCC,ACDA,AgBCA,AvBHA,COEE,ANCD,AsBAA,CjBAC,AWDA,AjBFAuF,C2BChC,A1BEiCe,AoBDA,CKAC,AXAA,AEAA,AIAAqP,CKAC3V,CXACgV,AfFA,CQEC,ARFA,COEC,AgBCA,CtBAC,AODA,AeCA,AFDA,CAACvT,EdAE,AKAA,CLACuI,ACAA,AIAA,CXCC,AcDA,APAAsC,EOAE,CRAC,CAAC9M,CmBAC,CAAC,AnBAC,EAAC,AKAA,CLAC,AcAA,ATAA,CSAC,GbAG,CAAC8L,IAAI,CAAC,IAAI,CkBAC,AlBAA,CkBAC,AlBAA,OaAO,CAAC;AMC7E,A/BDA,EGEE,AWAA,AaAA,ALAA4K,AlBHA,AGIA,AEAA,AMHAzT,AdAA,CGDC,C2BEH4Y,ArBCI,AoBDA,AjBAA,AFAA,AeCA,APDA,APAA,AVAA,AsBEA,ACFA,ATAA,AOEA,CVFC,ADAA,AGDA5Y,CFCC,AeCA,AvBAA,AODA,AMFAqP,AHCAxR,ELEE,AoBDA,AnBAA2K,AeCA,ATFA,AGCA,AdDsBlE,AeCtB,AGEA,ACFA,ATAA,CNCCvC,AoBDA6U,AJCA9B,AFCAN,ACFAU,ATAA3I,ADDA,AdAAvM,C2BEC,A1BDApC,AoBCA6V,CMAChL,ANAA8K,APFqB,AQGrBtE,ClBDCnL,AgBDA,ApBDA9D,C8BCZ,ArBCa,AWDAlC,AHFA,AjBCAD,CmBCCiV,AFFAhP,CRGC,ARDA,AKEAQ,AEAArG,CsBFfgI,ApBAgB,AWCA,ArBFA,CoBCC,CnBAC,AoBCA,ADDA,AGEA,AvBHqB,CyBEpB,AEAA,AvBAA,AgBDA,AGEAwN,CEDC9V,AEAA4J,CjBDC,AOFA,CbGCxD,AHDA9B,AcAA,CeAtB,AbFuB7D,CUGC,CjBDC,AKAA,APEAH,CqBFC,AFCA6J,ARDA,AbEAxD,AEAD,CEFE,AaEA,AjBAAM,CiBACmP,ANJA,ATIA,CqBFC3W,AVAAwV,AFFA,AOEA,ATAA,CAACtQ,CYCC,AvBAA,AECA,AgBAX,CKDY,AvBAAmB,AoBDA,AFEXsO,CrBFY,AKEA,CLFCpQ,EwBCE,ArBAA,AoBDA,CKAC,AJCA,ArBAA,AoBDAuR,ATAA,CcAC3V,AdAAyB,EIAE,CfCC,AeDAA,AGEX,ClBDYqE,AmBCR,ACFQ,AFEX,CrBFY,AsBER4Q,ACFQjV,CCCC,CxBDC,CwBCC,AHCX,CAACsB,ClBDY,EqBAE,ArBAA,CqBACvC,AFCR,ARFQ,CcAC,ANER,ARFQ,CcAC,ANER,ADAH,ClBDY,AeDA,AIER,ADAH,CGDY,ArBAAwF,AeDA,AGEX,CGDYsF,ADDA,CAClD,AFCyCoJ,GGDa,CAAC,EHCR,EGDY,ArBAA,CqBAC,ArBAAjO,CqBAC,AHCT,GPFY,CAAC,EXCE,CAAC,CyBDC,CAAC,EVAE,CAAC,GKE3E,CAAC;AMHL,A/BCA,AIDA,ESEE,AVEA,AWAA,AFFA,AeEA8E,AHAA,EMFE,AJCArH,AEAA,ATDA,AGCA,AJHA,AOIA,ATFA,ATEA,AEAA,AMJ4B,AdAO,C2BGlC,ClBACM,ACDA,AiBCA,AvBCA+B,AHFAjC,AIFoC,AeEpC,AEEAkS,CjBJqC,CwBEnC,AbDAnF,AHGAxD,AMFA,AECA,AhBHoC,AmBIpC,ATFA,ADFGnL,AdAOA,C6BET4W,A3BEAnU,AmBDA6Q,AGCA4B,ATFA3I,CNCC,ACDA,AQAAlK,AVEA,CEFCA,AJEA,CaFCwQ,AlBAA,AyBEAhK,AJAA,CbDC,ALCA,AsBAD,AJACmJ,CbDC,ALCAhO,AHFAlC,AoBCA,AbCA,CCDC,AiBCA,AlBAAsD,CiBDN,ATFO,CSEN3D,ATFOmN,AECA,AGCA0E,AfCA,CIFC,AGEAnI,AZFA,CSAClM,AGED,ASAC,CJFC9B,AHAA,ADFG,AdAO,CIIT,AFAAsF,AWAA,APAA,CJACJ,ADFA,AoBCA,AfCA8B,AgBAA6N,CGDN,ATFO,AfCA,AcAA,APEA,AMJA3T,AdAOA,CyBGb,ATFO,AZGCV,AeFD,AlBAA,AKEA,AEAA,CQHC,AVGA0G,CuBFC,AVAA,CJAC,CLAC,AQAA,AMEA,ATFAhC,AOEA,COFClF,AnBAA+B,ANEC,AFAD,AgBFA5B,EhBEE,AsBAA,CdFC,AIFT,AdAO,CUEG,ANEEsG,AIAF,AMJVrH,AdAOA,EwBIK,ATFA,APEA,CgBAC0W,ATFAlU,ATEA,AEAA,CqBFC,AvBEA,CuBFCzB,AJCP,CrBCU,AUJlB,AdAO,CyBGG,ArBCSK,CoBAD,AlBAA,CkBACoB,AlBAA2F,CIFC,AQAA,AVEA,CEFC,AeCP,APDO2N,AVEA,CiBDN7H,ArBCS,AIAF,CJAGvG,CUJzB5F,AdAOA,EeEmB,CAAC,CTEC,CuBFC,AzBEE,CyBFD,AzBEEF,AcFF,AZEAwG,CYFC,CMEC,CACjD,AVLiB,AdAO,CMI2B,CFAG,AEAF,CFAG,IqBDL,CAACiE,AXHlC3I,AdAOA,CeEmC,CAAC,EUCL,CAAC,IAAI,AXH3C,AdAO,CyBGqC,CIDQ,AJCP,CIDQ,AfFrD5B,AdAOA,IwBM1B,CAAC,IVNkB,AdAO,McAJ,AdAO,IcAH,AdAO;ADErC,EaEEoK,AaAA,AEAA,AhBAAgB,AYEAX,ANLA,AXIA,AEAA,ECDE,AoBDA,A3BEAzG,AgBFA,ALEA,AaAA,ALDA,AhBHA,AeEA,AIIA,ATJA,ADFA,AdAA,CoBEC,CVAC,ANEAwB,AHFA5B,AmBAA,AEEAzC,EOFE,AbDArC,AECA,AQEA,ALDA,AGGA,ATJA,ADFA,AdAA,C6BEC0Z,AXAAxU,AQEAA,ALDAqG,AEEAI,ACCAyL,ATJA/H,CFEC3I,AMFA,AIGAlC,CrBDC,CAACe,CEAC,AHFA,CGECwB,AeFA,CAAC4O,AlBAA,AoBCA,CLFC,AECA,AQEA,ALDA,CLFCjE,AHGA,AFDApF,AeCAxK,ALDA,AEEA,CLHC,APCAuK,AaGA,CvBJC,AsBGA,CXFCf,ACCA,AZFC,CWCD,AYGC,CbHC,CCAC,CVCC,ASDA,AIDA,AOEV,COFW,A3BEA,AiBFA,AKIA4L,AFFV5U,CTAW0H,AMFA0L,AOEA,CAACvT,AXFAnC,CcACA,AbDA,AMGV,CNHW,AZGA,AkBAV,GlBAcQ,CsBAA,CAAC,CVHC,AdGA,AaFA,CcAC,AbDA,AHGN,AEFML,CcACA,AzBEC,AFAD,AWANwJ,ASAJ,CHFW,CAAC,AGEVgN,ElBAc,AsBAF,CAAC,CbAL,CAAC,CAAC,ASAJ,CAAC9B,CpBAW,AsBEZ,CtBFa,AsBEZ,ETJc,CcAC,AdAA,CcAC,APEV,CAAC,OEEK,EAAExS,KTJiB,CAAC,IcAI,CAAC,OLIf,CAACoB,QAAQ,CAAC,CAAC,CAAC;AMJtE,A/BAA,E0BGE9C,AEAA0K,ADAA,ALDA,AhBHA,AeEA,AHDA,AXIA,AEAA,ECFE,AoBDAd,AjBCAlG,AFDA,AREA,AWCAqC,AFFA,AVDA,AsBGA,ACCA,ATJA,CdAC,CwBEC/F,APFAI,AjBAA,AaFA,AQIAsD,AtBJA,CyBIA,ChBDE,ALCA,AODA,AQDA,AIGA,ANJA+N,AOKA,ATJA,ATGAlL,CGFCvC,AgBCA,AdDAuH,AYEAkL,ACCA9L,ATJAgE,CYECjE,CAACX,AzBAA,AWCA,CAACpD,ACLA/E,AdAAA,CSGC,ASDA,CTCCmI,ALCA1D,AcFAhG,ChBEC,AMCA+G,CIFN,AeCO,AvBAA,CQDNzD,AEHO,AdAA,C2BIC,AJCA,ADDP,CbDQ,ALCA9D,AcFA,AKGA4V,AjBAAlP,AgBDPxC,CJFQ,APCA,ALEA8C,AEAAO,AMLAtF,AdAAA,CSGC,AIEA,AEHA,APGD,EIFJ,ADAO4J,AMFA+F,ATIA,AcDP,CVDC,ARCO,ASCA,AIJA5O,AFCAxD,ATGA,AgBDP,ClBAQ8G,CECC,CKFC,AMFA,AOKA,CAAC,CPLCnC,AOKA,EpBFE,AmBCA,CMHd,AzBEesC,AWFA,ADFA,AdAA,C6BEd6D,AZDe,AFCA3K,ADFA4C,AdAAA,CuBKCyB,CNJC,CJIC,CDFN,CRCQ,AkBAP,CVDC,AMDO,CAAC,AJFA,AQIPmS,AtBJO,CuBKC,ATLAlW,AdAAA,EYGL,CAACwM,AEHO,AdAA,CcAC,AdAA,CsBIN,COFP,AdAe,AOEP4H,COFP,AdAe,CcAd,CAAC7H,GPEW,COFP,APEQ,COFN7C,IAAI,EjBCS,CAACsB,CiBDL,AdAa,CAAC,EHCL,CAAC,IAAI,CAAC,CAAC;AkBD3D,AJGP,A3BHA,EGGE,ASDA,AUCA6K,AhBHA,AeEA3V,ERAE0D,AFDA,AeEAsS,AEAA,A1BFArW,AsBGA,ANJA,AOKA,ATJA,ATGA,AEAA,AcDA,CAAC,CQHQmb,ArBEP9W,AoBDA,AXAA,ALGA,AMHA,ACCAhE,ANHA,AQIA,AtBJA,CoBGA,CVDE,AiBEA,AXHA,AZGA,AaHA,AOKA,ATJA,CeDQ,ApBCP0K,AiBEAnG,AtBHAkD,AeEA,AHFA0J,AOKAkG,ATJAzI,CeDQ,ArBEP,AoBDA,AhBGA5K,AZHA,AOGAkF,CCFCa,AoBDAP,A5BAApF,AsBGA,AjBAA,EeDEuR,APJA/T,AdAAA,CIIC2E,ASCA,AQDAkE,CQFC,ANGA,CdFC,AGAP,AeCO,AJCAgM,CXFN9S,AFDO,AiBEAzC,AdCA6E,APAA,CuBHCyD,AnBAA,AeER,AXJQ,AdAA,CSGC,ACDA,AeERyM,EDEU,AlBDA,CuBHC,AREA,AGEA,AlBDApX,CMFN,AaCD,ADEQ,AVNA,AdAA,CYGN,AaCD,AZCQ,AZHA,AoBEA,AJHA,CQGP,ArBAQ,ASCAyH,AZHAzG,AsBGA,CEDPwM,ApBHQ5E,AkBIA,ClBJCC,AkBIA,ANJA,AHDA,AdAA,C2BIC,AvBAA7H,AWFA,CNCC,CgBCP,AxBFQ,AaFAZ,AdAAA,CyBIP,AEAQ8K,AdCA,AZHA,AgBDA4H,AFCA,EXEE,AECA,CFDCnL,ACHA,ACIAD,AEAb,AMLa,AdAA,CeEC4G,APGb/F,AMLa/E,AdAAA,C2BIC,AtBHA,COEN,AaCD,EbDG,CeCQ,AnBCb,AMLa,AdAA,CQKZ,AMLaT,AdAAA,CQKZ,CIFO,CAAC2K,AeCO,CAACsL,ArBCA,CWJC,AXIAhR,AQLA,AdAA,CIIC,AaHA,AHDA,AdAA,CIICN,AaHA,EXIE,AQLArE,AdAAA,CMKC,MqBDM,EvBAE,EQDL,CAAC4I,AEHO,AdAA,IYGH,CAAC,IAAI,CAAC,CAAC,EGDZ,CAAC,CAAC;AbGxD,AwBDCrJ,A3BFD,E+BAE,AHGA,AhBAAmK,AVFA,AsBGA,ACCA,AlBDA,AgBDA,EbDE,AGAAlI,AFDA,AQAA,ACAA,AEEAtD,AhBHA,AeEA,AHFA,AFCA,APGA,AMLA,AdAA,CmBEC,ALFA,AdAA,C6BEC,AJEAwJ,ANFA,ALFA,AdAA,C0BGL,ChBDO,AMDAvK,AZGA,AsBDPqY,ANAO,ALDA,CeDCqD,ApBCApQ,AUCAyK,ALDAvG,CcAC,AZDA,ATIA,CqBHCjE,AREA,CSHCmQ,A1BGA,AiBAAla,CSHA,A1BGC2E,AUJAxD,AdAAA,CcAC,AdAA,C8BCC,AtBIA,CIFN,AIFO,ALGA4J,AHCAxE,AMLA,AdAA,C6BEC,AjBCPzD,AIFOrE,ALGA0C,AeDhB,ALCgB,CQFC,AlBEA,AUAC,ANFD,CcAC,ATCA,CTCC,AeDnB0V,ANAmB,CJFC,AIEA,ALDArY,APGA,CQJC2R,ARIA,CIFN,ARCO,AICA,CIFN,ARCOvK,GMFG,CAAC,AWEAgE,CXFC,AgBC5B,AXD4B,CAACjL,CXEC,CAAC6G,CYHC,CSGd,ATHewK,AZGA,CqBAd1G,CrBAgB5D,AiBAC,ETDN,ASCO,CAAC,CTDN,EIFS,CAAC,CJEN,AGDO,CHCNiG,AGDO,EXEE,EqBAb,ArBAe3M,CqBAd,CAAC,CAACwM,ErBAiB,CAAC3F,CqBAd,CAAE8C,AVFc,CAAC,GUEX,EbDS,CAACsB,CaCL,ArBAa,CAAC,EQDL,CAAC,IAAI,CAAC,CAAC;AVCnErJ,ADDD,ESAE,AiBGAgO,ARHA,ACCA,AGGAmG,ACCAjL,AlBDA,AEDA,AcAA,EQJE/L,ArBEA,AoBDA,AjBCA8E,ADCA1B,AUAA,AhBHA0F,AUCA,CcAC,AlBEA,CkBFC,AzBEA,ASCA,AFDAqE,AMJM6F,AHANxR,AdAAA,C2BKCqP,AvBDA,AFDN,COAO,AgBCA,AECD,AzBFNpL,AmBCO,ANFA,ATIAmE,CGHCxE,AYCAyG,ANFAqE,AOGA3H,CKAC,CzBFT,AGFU,CoBGC,ApBHAG,CIEC,AgBCAoF,AFEAkJ,ATNA,AdAA,CSGC5S,APAbqB,AqBGY,AjBACmE,AQNAnI,AdAAA,CMMA,AgBDC8G,CVFN,AWGO,ADDD,CVFLxD,AVAT,AmBCgB,AfEA,CgBDC,CbFC,AKHA,AdAA,CWIC,AUAA8G,AhBHA,AmBMAE,ATLA,ADFA,AdAA,CSGC,AECA,ANHAhD,AmBMD,CbHE,CCDN,AYIO,ATLAtI,CHCN,ISCW,GIAG,AVFA,CUECmK,AVFAhK,EeDd,CAACU,CLGiB,CbDN,AaCO,CpBHC,COEN,APFO,IOEH,CAACuM,CkBFR,CAAC,AzBAgB,AUCA,CeDf,AfCgB,CVDC,KSDK,AdAA,EcAEzK,AdAAA,CcAC,AdAA,CcAC,AdAA,IYGH,AGDO,CHCN8I,AGDO,IHCH,CAAC,IAAI,CAAC,CAAC;AXDjErJ,AFAM,EWELmJ,ACCA,AQDAoK,ACCAjV,AZEA,EsBLE,ADCA,AjBCA2D,AeEA,ATHA,AGEA,AEEA,ANPe,AOQf,ATLA,ATIA,AgBDA,CLNgB,CRIdM,ALCA+B,ASCA,ARJA6B,AeGA7H,ArBHOnB,AeDP,AdAA,CCCL,AmBGK,CSFE,AnBCAgM,AeCA,ATHA,AfAPlH,AoBGO,AJLe,AOQf,ATLA,CcACiH,AnBCD,AWCCC,ADAA,AIGAoM,CMNCgE,ArBEA,AkBEAlD,AdAAvK,APCAzN,CGHCkD,ACAA,AaGA,ADDAgT,CZFC,AeCA,ANDAhB,AFJe,AFGf,CeDC,ALGAI,ArBAA,AeDAH,AlBFZ,AIAY,AYFe9D,AFGf5C,ATIA,AQNArM,AdAAA,CIICyE,CiBAC,AhBHA,AkBKA,AfAA1E,CsBLC,ArBEA,AGAP,AXFRyB,AoBGe,AEEA+S,AjBAA,CMHN9S,AOAO,AECA,AGGA,AFFA,CKAC,AdAA,AWEA/D,AhBDAqC,AcDAiS,CbFCxS,AUAA,AdFA,AGKA1C,CsBLC8b,A/BAO,C4BINzb,AdAAJ,AZJpB,AcCoB,AhBDO,ASKP,COJCgD,ATIA,CwBLC,AlBEP,AaCO,ArBAA,AIEA,CsBLC,AlBEP,AaCO,AHCA,CQJC,ALGA,AZCA,AUCA,ARJA,ADFA,AdAA,CIIEpC,ASCDX,AUCAuL,ARJA,ATIA,CuBJC,AvBIA5L,CuBJC,AZHe,CYGd,AFGA,CAACkZ,CvBDE,GmBEE,ACCA,CpBHG,ASCF,AWEA,CXFC/T,CJFT,CAAClB,AGAG,ANGO,CAACuD,CMHN,ACEO,CWEC,AlBDA,CODC,APCAjF,CqBDC,AdAA,AWEA,CZJN,ACEO,CDFNsL,AGDO,ATIA,CGHT,AMDU,ATIA,CGHT,CAAC,AkBEU,CHEC,ClBDC,CSJC,ATIA7N,CqBDC,CAAC0F,EZHE,EAAE,GYGG,ErBCE,CMHN,ANGOqC,CMHNkE,IAAI,CAAC,GNGU,CMHN,CAAC,ANGO,CMHN,GNGU,CAAC;EuBH7E,AjBCA,AFCAH,ACCAkB,AUDA,AEEA,AxBLAhN,AuBIA,EQJE,ArBEA,AkBEA,ATHA,ACCAoW,ACCA,AHLA,AXOA,AEAA,AMNA,AdAA,EyBIE,ApBHApN,AmBMA,ATLA,CUEC,CAAC,AECA,AXJAoJ,AZGA,AeDA,ACCA,AdEA,CqBDC6G,ARFA3W,ACCAkU,AdEA,CYJC5V,ADHA+R,AFGA,APIAhI,CsBLCwR,AfCAzW,CXEC,AOCAsH,AaEAjK,CRNC,AZGA6D,AOCAiG,AZJA7M,AOKA,CwBLC,AdAA,AjBAAC,AOKAE,AEAA,EFAE,CqBDC,ATHA,APGA,AaEA,AhBDA,CWHC,AFJA,AFGA,ATIA,CqBDC,AhBAA,AQFAmQ,AdFA,AeGA,ALFAhO,CLECwJ,AQFApG,AEEA,AIGA,CdHA,ALHC,AeGA,AHLA,AlBEA,EWGE,AXHAxF,ASKA,CgBCC,CpBHC,AeDA,AKIAiY,CLJC,CDDC,ADHAnF,AlBEA,CKGChS,AcFA+Q,AHAA,APIA,COJCxP,AhBDA,ASKAa,GSPG,AFGA,APIA,CJFC,AaLAY,AOQA,ATLA,APIA7D,CJFCmH,AeDA,AKIAvE,CLJC,AXGA,CSPC,ATOA,CUJC,CDHC,COQC,CRNC,AZGA,AoBGAkO,CRNC,AZGAxJ,GoBGG,ATLA,CSKC,ATLA,CSKC,CpBHC;AmBG/C,EOLE,ADEAsE,AjBCA,ASCAgL,ADDA,ANJA,AQMA,AtBNA,ESGE,ACCA,AeAA,AdCA,AQFAX,AdFA,AUCA,AhBDA,C0BGC,ApBHA,CoBGC,AECA,AXJA,AHIA,ARJA,AYFArD,AOQAlQ,AlBDA,EuBHEkJ,AjBCAK,AFAA,ANAApF,AOCA6F,AQFA,CUAA,AnBCCnH,ASDApD,AGGA+U,CbHC1M,AkBEA,A5BJAxK,AOKA,CuBHC,AFEAuF,ArBCAvF,CKDC,AMNA,AlBEA,CsBIC4W,AfCA,CGHC,AYED,CjBDE,ALHAvX,CWGC,ANAA,AiBCA,AfCAyB,CGHC,ACCAF,ACCA,AWCAsW,CVFCjL,AeCA,ARFA,AGGD,CVFExH,AeCAgM,ARFAN,AbGA,CFFC,AkBEA,ClBFC1J,AOCA,CAAC8F,CFFC,CkBEC,AHEV,CZHW,AeCA,ARFA,AKIV3I,AzBNU,C4BIC,ARFA,ApBFA3D,CUECoK,AGCA,GbHG,CyBMT,AzBNUnK,CyBMT0C,CdHW,ANAA,AOCA,CDDC,ANAA,COCC,AQFA,CAAC,CVAL,AeIJ,CfJKoC,AeIJ,EzBNY,CAAClF,CUEL,CAAC,CAAC0J,CCCO,EAAE,CXHC,CAAC,CUEL,AVFM,CUEL,ACCM,CDDL,ACCMqC,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AaE1ErJ,EOHC5C,ALEA,ANDA,ACEAuW,EXFE1T,AoBAA,AjBCA,AFAA,AiBCA,AXJA,AECA,AGGA,AhBJA,AmBMA,ATLA,AhBDA,AOKA,AEAA,AcAA,CNLC,AQMA,CRNC,AZGA,ASCA,AFAA,AMNAoQ,AOQA,CpBHC,AmBCN,CbDO,AaCPyE,ARHO,AhBDA,CWGChS,AKFAoG,AhBDA5L,CaGC6K,ACCA4D,AFAAxB,CUAC,ACCAgK,CFDCZ,AHNA,CaGCvW,AVGD,ArBJC,C+BCA,AjBGC,AINA,CIMC,ADAA,CUHC,ApBEA,AWCA4L,AtBJA1L,CWGCa,AGCA,ASCA,CCDhB,ADCiBsU,ELPE,AlBEA,CcICzG,AFAA,AYApB8I,CdFW,CAAC/S,CEEWkI,AUAA,ACCA,CTDC,ASCA/C,CTDC,CAAC4E,AEHA,CJGC,AIHA,AOIA,CXDCtB,AIHA,AOICjJ,ECD7B,EbDgC,CAAC,AYEC,CTDA,CAAC,EDDb,ACCe,AFAA,AWCEA,CbHX,AGCLQ,CHDMgG,GaGe,CbHX,ACCU,AYEEjB,CbHXvJ,CCCW,CDDT,CAAC,AaGY,CAAC,CZFD,CAAC+L,IEAX,CAACtH,KFAoB,CEAd,AFAeqH,CEAd,GFAkB,CAAC,IAAI,CAAC,CAAC;ASAzE,AXGA,EIFE,AaCA4B,AEAA,AXJA,AKIA,ANHA,ADFA,AQMA,AtBNA,E8BEE,ArBCAhJ,AoBAA,AnBCA,ANAA,AcFA,AbDA,AeIA,AIEA,AzBNA,AOKA,CFFC,CAAC,AOCAgI,AMNAqG,EaGE,ADCA,AnBCA,AGAgChT,AOChC,AIEA,AzBNA,C+BCCkc,ADCA9C,AnBCA5T,AUCA4Q,AIEA+B,AzBNA/X,CmBCCqO,APGA,ANJA1F,CMICmE,ALCA,COFiC,CIL/B,CCGC,ALEgC,AOChC,ArBJA,CqBIC9K,AHNA,AXOA,CwBJC,ArBCP,ACCO,CDDN4C,ACCOnE,AQFA,AnBDC,E+BCC,CDCC,AJEA8M,AdAA,CFFN,AoBAOkE,AJEApH,APHAiE,CTCN,AJFO,CyBCCa,AnBGA,CSAC,CKAC,APHA,AbDA5G,AeIAtG,CFHC,AMKA,CCFC,APHA3B,APGA,AaEAG,CbFC2L,ASAA,CAAC,CSFC,ExBFE,CwBEC,AnBCA,ALHAjE,ANAAtI,CWGC,AQFA,CTCN,AoBAO,AXDA,AEGA,ArBJC,CqBIA,CXFNwK,ASDO,AnBDA,E+BCP,AnBGS,CmBHR,AnBGSyC,CmBHR,ArBCE,ACCO,ALHA,CIEN,AJFOtE,CKGC,AcGA,CAAC,GdHG,CAACqD,CCCC,CaEC,EAAE,GdHG,CAACF,EcGE,CnBNC,CKGC,ALHA,CKGC,IAAI,CAAC,CAAC,QLHQ,EAAE;AWC7E,AGCCrJ,AXID,EIDE6K,AeCA3B,AvBFA,AiBEAC,ADDA,ALFAA,ATGA,AQNApJ,AQOA,AtBPA,E8BEE,ArBCAkC,AoBAA,AnBCA,AeCA,A1BJA,EmBAmC3E,ALE0B,AFE3D,ANJA6I,AmBMAlG,CXJ4D,AMDjE,CWAO,ApBEA,AeCA,AZF2D,AMDlE+S,AEIO7J,AJRS,AFKTA,AhBFA,AeDApJ,CgBEC0Z,ApBEA3W,AeCAkS,AJCD,ANHA,AhBFCrX,AeDAU,AQOAqW,AtBPA3U,CkBCkC,APIjC,CAAC+J,AUCA,ANHA,CGFkC,AJDjC,CTCC,CSDC,CTCC,ALDA/J,CSGN,ACCO,AVJA1B,C8BEC,ArBCPiE,ACEH9C,CeAW,A1BJA,CaICqL,APJA,ALDA,C8BEC,AlBGA9C,AeCAmB,ARJnB,CVCa,AgBEO,AECD,A5BLCtL,ACDA,CSGN,AEEO,AMPS,CUQR,AhBDA4M,AQHtBwI,CWAuBiE,AlBGA,AKPS,AOSnB,AFAUvC,CGFCI,ADEVrT,AFAUqF,CVFC,GbJG,AuBMA,CZFT,AXJUjJ,CWIT,AYEU,CXFC,EZJE,CYIC0M,AQHlC,CVC4B,EAAExC,EeID,CAAC,CMLC,ArBCG,CqBDF,ArBCG,CqBDF,CNKC,CbFW,AaEV0N,CCFD,CAAC,EfAI,CAAC,CAClCtX,WcC8C,CAACgC,CCFD,EAAE4H,CfChC,CAAC,AcCmC,CAACsG,CCFD,CAAC9M,EDEI,CAAC,CdDlC,AcCmC,CCFD,ADEE,CdDlC,AeDiC,IfC7B,CAACkH,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;AML3DrJ,ARMD,EEAE,ANDA,AgBCA4T,AdCA,EwBLE,ArBCA,AoBAA,AjBEA,AaAA,AECA3R,ATNqD,AGMrD,AGCA,ATJA,AhBFA,AeDA,AQOA,AtBPA,CkBAsD,AMOrD,CNPsD,ALGrD,AFEAtD,ANJAyH,AYJ8C,AOU9C,CRPL,ACHoD,CaK7C,ADCA,AjBEA,AaAA,ATLP2I,AZKOjK,AiBCA,ANHA,AhBFA,AOMAkC,AQPA,AdAA,C8BEC0S,ADCA3R,AjBEAmD,AaAA8J,AJCArX,ANHAoL,AhBFAjL,CcECsD,CJAC2G,AaIAwM,CFDCX,AdCA5M,CuBJC,AhBAA,AFEA,ASCD,AdCA,CKFE5H,CFFC,AoBAA0I,ATGA,AdCA,CqBDN,AdHO7G,CcGNiB,AZHO,AhBFA,AuBMA,CQLC,ALGA,ATLjB,AKMiB,ANHAiH,AOIAsJ,CVFC,AaAAlJ,ArBAAzE,ASFA,AFEA,AUCA0F,AhBLA,COICzC,ARAA5C,ASFA8G,AFEA,AZJArO,C+BCC,AdFpBmR,AXCoB,EsBKL,CfDQ,AeCP,AZHO,AOIA,CQLCU,AfCA,AOIAkF,COJC,AjBEA,AaAA,AVFA,CcAC,AJEA,CIFC,ARGA,AtBLA,CKIC,ALJA5W,AuBMA,COJC6M,AjBEA,ADAA,AWECrJ,CVFA,AIL9B,AZK8B6D,AOAA,AUCA,EIDG7D,AJCD,CQHC,ARGA,CQHE+F,AzBED,ASFA,AQGA,ACCC,CTJAyE,CcGN,AvBDO,CqBAE,CECP,ALCSxK,CTJD,CAAC,CYEG,CIFA,AFGR,A5BLO,C4BKNuJ,A5BLO,AuBME,CQLZ,ARKahE,CQLZ,CAAC,ADCa,EPIE,KAAKA,IAAI,CAAC,EKDP,CAACuC,IAAI,CAAC,A5BLO,CAAC,CAACrL,E4BKL,CAAC,CAAC,G5BLU;ASM5E,ECHE,AGEA,AFEAoL,AKJA,AOIA,EQLE,AHIAnH,AvBDA,AOAA,AUCA,AhBLA,AeKA,AICA,AzBNA,AOMA,CDNC,CwBECqF,AJEAS,AZDA,ARHA,AYJAlK,AHGAwC,AdAAA,E8BEE,AVIA,AICA,AzBNA,C+BCCsZ,AVIAjG,AICAgC,AzBNAzX,C0BIC,AZDAiO,AQEAkI,AJTA,CQQC7S,ArBAA,ASDA,APGA,CeDC,AJTA/D,CPUC4L,CmBJC,AnBID,AGHCxL,AOEA,CSHCoM,AzBEA,AiBCApM,ADAA8B,CVCC,AeFA,AECP,AvBDOsE,AaRA,CUSN9B,AVTOzE,AXUA,CQPC,AdAA,CyBKC8D,AXLAV,AdAAA,EMOE,CuBJC,AhBCA,APGAzD,CwBLC,ADCCC,AFGR,AdFO8O,AQEA,CIDC,AECP,ANAOA,ADAA,CAACpM,CUJC,AbLA,CAACwC,CbQC,ALJA,CKKrBuC,AoBCsB,AzBNA,AeDA,AdAA,C8BECuQ,ADCC,ALIDlX,AzBNA,AeDAE,AdAAA,CoBMC,AHTA,CGSC,CdCC,AQPA,AdAA,C6BGG,AvBIFuG,AQPA,AdAA,EaIE,APGA,COHC,AQEA,AfCAY,CqBDN,ANAO,ADAA,CAAC,COAN,AvBAf,ASFsB,APGA,CFDrB,ASFsB,APGA,CFDrBL,AiBAsB,CAAC,CMAN,CAAC8F,ArBCO,CkBAC,AlBAA7N,CkBAC,IpBDlB,CAAC,CoBCuB,CpBDrBgI,CoBCuB,ElBAE,CFDrB,AECsBD,CFDrB,C0BJO,A1BKrCE,C0BLsC,ANKgB,CMLf,CHIU,CAACgE,GrBCU,CqBDN,CAAC,ArBCO,EFAnD,CAAClE,CuBD+C,ArBCO,CqBDN,ArBCO,CqBDN,MvBCxC,CAAC;AIA7B,AcCA,EbHE,AGEA2F,ARCA,AOFA,ASCA,ALFA5B,AhBHA,AOMA,EwBLE,ApBKA,AiBDA,ATNA,AGMAkL,AhBLA/N,AYJA,AHGA,AdAA,CiBHC,AHGA,AdAA,CyBKC,AZDA6F,AQEA,AJTA,AOUA,AVPA,AdAA,CaIC,AQEAxM,CSJC,ADCA,AnBIA,AiBDA,AdFAwB,CiBFC0Y,ApBKA9W,AiBDAA,GEHG,AJEAiF,AZDA,AWGA5H,CKJCoX,AfHAhX,AdAAA,CcAC,AdAA,CSICgI,AIAAnH,CHGC,AeFA,AECA,ANAA,AhBLA,ASDA,AdAA,CUOC1B,AeFAsH,AECA7I,ANAAwB,AhBLA2G,AmBMA,CXHC,CDECwE,CAAC/C,ASAA,AGCA,ATHAmB,CUCC,AJCA,ANFD,CUCE,CAAC,AVDA,CHEC,AYCA,CAACwM,CZDC,AFCA,CoBLC,ApBKA/V,AWDA,CAAC,AhBLA,CwBEC,AxBFA,CyBCC,ADCAtC,AnBIA,CAAC,CDHCkL,CAACC,AkBEA,CGJCwN,AHIA,GEHG,CAAC,AnBIA,ALNA,CKMC,CiBDC,AtBLA,EIGE,AkBEA,ElBFE,CeGC,CGDC,AHCA7V,CGDCoW,CtBLC,EAAE,CmBMC,CAAClI,IAAI,CGDC,AHCA,CGDChF,AHCA,IGDI,CAAC,IAAI,CAAC,CAAC,GGJjB,CAAC,CAAC;AVKtD,AZAA,AcACrJ,EZCC,ANCA,AOFAqK,AZJApM,AOMA,EwBNE,ArBEA,AGEA,AaDA,AECA,ATNA,AGMA,AJRA,AFMAgE,CUCC,CIFC,AJEA,AZDAiK,ARJ8C3F,AmBO9C,AVPA5H,AdAAA,C6BGC,AhBCA,ASEN,CQJO,ADCA,AjBGA,AeAA,AvBEAgB,ASJAyM,AQEA,AJRA,AXUA3G,AgBFP8O,CQJQsF,AHIA/W,ANAAiR,AJRAhE,CRMC1S,ASJA6O,AMOA/L,CpBCCR,AcRA,CNMC,AREAwF,ACR8C,COM7C4C,AENA,AdAA,CkBACnK,AGMA,AhBN8C,ACQ9C6H,AQRA7G,AQMb,AtBNaA,CWMCyL,AUAAL,AGCA,AlBCD,CqBFE,AdFA,AFED,AIFN,CNAQ,AGEA,AeAA7L,AVRA,AFMP+D,ATIO,AgBFhBqS,CXAiB,AMRAhE,CLQChT,ACFA,ACJA,AdAA,CSIC,AQNA,AOSA,AVPA,AdAA,CYMC,AREA,ALNAU,CmBFC,AGMA,AJRA,AOSA,AzBLD,C+BAE,A1BMAsE,AcRA4J,AGMClC,ANFR,AOEf,CECuB,ATHP,AhBFO,E+BAE,ArBEAxC,AGEAM,CREC,AiBFC,EjBEC,C0BNC4K,AlBIA,CAACpV,ACFA,AQEE,ETAA,AeAA,CAAC,CfAC,CMNC,CAAC,CHIN,EGJS,AHIP,CGJQ,GSMG,AZFP,CAAC0N,CYES1K,CAAC,GlBFX,CAACC,AkBEe,GlBFZ,AKJa,AdAA,CSIZgI,CKJcjI,AdAAA,CcAC,AdAA,CcAC,AdAA,E8BEd,CAAC,CAAC,CfEU,CNAL,AMAM,CNAL;AWEnDP,EVGCsJ,AeHA,EKHE,ArBEAjM,AoBDA,AzBKA,AcRA6O,APMA,ANP8D,AUK9D,AhBFAhO,AOMA,AQRA,AdAA,C6BGC,AXHA,AbD8D,CwBI7D,AjBGA,AeAA,ATNAgD,ALIAgL,AQEA,AhBP8D,AYD9D,CJMC,AOCN,CUHO,AjBEAG,AFEA,ASDPoH,AIEO,ATHA,CeFCqG,AnBIAhQ,AIFAoD,CHEC,AeAA3M,AvBEA+E,AcRA,AnBEA,CUEC,AGEAyC,AeAA,A5BJA5J,AOMA,CGJCsH,ACIA6D,AiBFAjL,ANAAgW,AJRA,CPUA,AQRCpT,ALIA,AOCZ,CPDa,AQEA,CTAC,AFEA,AiBFA,AvBEA,ASJA,CKJC,AEKfwS,AHPevP,CCEC+H,AGMArO,AfEA,CGJC,AGEA,AREA,C0BNC,ArBEA,CAAC,AkBEA,AhBAA,CSDnB,AHPoB,AFMA,ATIA,CwBNC,AlBIA,AKRC,AFMDO,ATIAf,CKFC,CPEC,CiBFC,AJRAgE,CaIC2N,ATIA5C,CMAC,AhBAA,AZJA,CKMC,AaVC,AlBID,C4BIC,AvBEArH,GcRG,CAACiH,AZQA,CAACnH,EAAE,CYRC,AnBEA,AOMAa,CYRC,AHIA,CMEC,ANFA,AhBFCrH,CKMA,AiBFA,CjBEC+G,EEAE,CeFC,AtBJC,AOOvC,CeHuC,CNFC,EeFV,AfEY,AhBFE,AOOxC,CwBP2B,AxBO1B/H,CwBP2B,A1BMY,CaVC2S,CbUC,AWJA,CAACzC,MENM,CAACkD,AXWtC,CAACrL,EFDwC,CAAC,CWJC,CENE,AFMDkE,EENE,CAAC,CFMC,ATKtC,CSLuC,CTMjE,GSNqE,CAAC,ATMlE,CSNmE,ATMlE9L,EACP,CAAC;AmBLL,EhBDE,AEEA,ANPA,ACYA,AQXA,AdAA,E8BEE,ADCA,AjBGA,AFEA,ANAA,AcRA2O,ADFA,AFMA,APEA,CUNC,CAACE,ALIAnL,AQEAoT,AGCA,AzBLA,E+BAE,ADCA,AnBKA,AiBFA9T,ANAA,ANFA,CeFC+S,ADCAkE,AnBKA1U,AiBFA,AdFA,AQEApD,ANFA2N,CYEC/C,AdFAgC,AdFAlO,CKMC,AIFA2J,GUNG,CdQC,ALNA,ASIA,CEEC,ANAAxC,ALNAlH,CWMCqB,AQRAqT,CGMC,CAACpT,AtBJA,C8BCC,AdCA,CeFC,ADCA,AdCAxB,CcDC,ARGA,CAAC,CSJC,AHIA,A5BJA,C4BIC,ATNA,ALIA,CHIC,AiBFA,AdFAiD,CHICrB,CoBNCiT,C1BMC,ASJA,CTIC,ASJA,EdFE,CWMC,CAAC,AWFA,AtBJA,CKMC,AiBFA,EjBEE1N,AWJA,CAC/B,GLGmC,CAAC,ANAA,CAAC3F,GAAG,CAAC4C,CWH/B,EACV,CXE6C,CAAC,CAAC,C0BNb,AfIlCa,CeJmC,CAAC,gBfI5B,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AUFJrJ,AdED,ANPA,ASCA,ELKE,ACGA,ANAA,AEIA,AENA,ARLA,E8BCE,ADCA,AjBGA,ACFA,AILA,AFQA,CFHC,CQEC,AGCA,CCHL,CKFO,ADCA,AjBGA,AaFPgW,AEEO,AZCA,AhBLA,C+BAC+D,ADCApD,AjBGA7T,AGCAuK,AfNAvM,CqBKCmJ,AGCA,CPRC8F,CUOC,A5BJA,C4BICjN,A5BJAxE,CsBIC,CZDCmK,AHOAjI,ANXAM,CYKC,AZLAC,CYKCvB,AbJA,CAAC,AOUAgB,CeNC,AJPA,AlBGA,AOUAjD,ANXA,C2BKC,AZCA,CcJC,AFGAiZ,AZCArY,ATKA,ANXA,C6BEC6P,CRGC,AfMA,CeNChF,CZDCP,AkBCA,ClBDCV,AgBDzB,AEEyB,CGJC,ADCA,AFGA,CGJC,ADCA,CCDC,ADCA,AJC5BiO,ChBC6B,AGCA,CAAE,CHDA,AYCA,EAAE,GNCG,CAC/B,CHFiCjO,IAAI,CAACxK,CGE/B,CHFkC,CaF9C,AVKK,CHH0C,CAAC,EAAEwC,AGG7CqD,MHHmD,CAAC,CAAC,UGG7C,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AJJJrJ,ANPAA,ASCAA,EeIC,AjBGA,AFGAuJ,ANAA,AaVA,ATQA,EsBLE,ArBGA,ASLA,ALKAjF,AEKA,ATEA,ANXA,E2BKE,A5BJA,CYGL,ANPA,ASCA,CgBGO,A1BOA9D,AOJPkJ,AUCO2K,AhBRPzO,AmBSO,ATGA,ADXP4G,AdEO,C8BCCtD,ApBOAK,AKCAwD,CNLChF,ACID,AWHC,AfMAxF,CFHC/B,ASJA,AQCAd,CXGC,ANAAyF,ASJAV,EJAE,AeEAoR,AlBKA,CGPCpQ,ADEAA,EFKE,CDdhB,CQOkB,AFAlB,CUCmB,APPnB,CLMoB,ALIA,AiBHA9F,AhBRpBiG,AGSoBH,CCFC,AIAA,AFArBiE,AIKqB,APHAnM,CCFC,ALIAA,AWCAY,ATEA,AQbtBqO,COOuB,AbCA,CJEC,AiBHA,AGCA,ChBAC,CsBLC,A1BOA,AEGA,CwBVC,ANKAhP,AlBKAoH,CwBVC,CxBUC,CDd7B,ACc8BpE,COPCpC,AWEA,CbF/B,AaEgCwC,ClBKC,CeNC,AfMA,AQblC,COOmC,CRDC,CWEC,CXFC,AWEAT,ATGA,ATEA,CSFC,ATEAgF,IkBLI,CAAC,ETGE,EAAE,ATEA,EAAE5H,ESFE,ATEA,CSFCiQ,ATEA,aSFa,CAACnE,IAAI,CAAC,IAAI,CAAC,CAAC;EcL7EH,AjBGA6B,AKPA,EaEE,ArBGA,ACIA,AiBHA,AvBGA,AcTAnN,AHUA,AhBRA,AOUA,AELA,CmBDC,A5BJA,C4BIC,AdDAe,AQCA,AtBJA,ACDA,E8BCE,ArBGAsB,ACIA,AOTAgQ,AOOA,ATGA,CeRC+J,ApBOAjR,AKCAiE,CXDC1H,CEGC,CYZC,AlBCAtE,CkBDCnD,ALKA,CAACe,AWEAkX,CpBEC,AEGA,EIHE,AQTA,CRSCtM,ANAA,AcTA1J,CLKC,APOA,ANXA,C6BGCoJ,AjBGA6B,ACFA,AEKA,ATEAxI,CuBRA,AjBGA,AGGCpE,CEVC8R,AjBCAhQ,C6BGC,AjBGA,AKPAqE,CbSC,AoBFA,AlBKA,CAAC,CwBVC,ArBGV,CqBHW,ArBGVxC,AeEUtE,CMLC,ApBOA,ANAA,CMAC,ANAAsH,AcTA,CAACoH,ADAA,AjBCA,CkBDC,AMOA,AxBNA1L,CkBDC,ADAAuP,AOOAtS,CdEC,CAACsK,AVRA,CAAC,EeSE,CLDC,AKCA,CLDCxK,CNAC,AaTA,AjBCA,CUQC,ANAA4H,AoBFA,AxBNA,CUQC,AGJA,AILAyK,AOOAiG,CfFT,CAAC,AIAUzX,CJAT,AMKU,EAAE,EFLE,CJAT2J,ALIU,ASJArD,CEKC,CXDC,AaTA,AFUA+I,CSHC,CfFT,AQLUqC,CRKTvS,AeEU,CXFC,AWEA,CfFT,AIAUgP,AWEA,EfFR,CQLW,EbSE,AaTA,CbSC,AWCA,CAAClD,EFLE,CAAC,CEKC,CAAC,IAAI,CAAC,CAAC;ELAzE,AiBHA,A5BJA,AOUA,EwBVE,ADEApH,AjBGA,AREA,AcTAiK,ALKA,AILA,AFUA,APHA,CUPC,ALKA,CJACjM,ASLAoM,AGMAgI,ArBLA,E8BCE,ATIA,AGCApU,ATGA,CeRCkJ,ATIA1J,ANIAwN,CHHC9B,AKPAsF,ATOA,ARNA1P,CIQC,AcTA,CAAC,CAAC,AlBCA,E8BCE,A1BOA,AIFA,ARNA,C8BCC,ADEP,AzBKOwE,AaTA,ATOAE,CsBLC,ADEPvD,CjBGQ,CKPC6N,CIMC,CTCC,CJAC,CqBHN,AREO9F,AbCA1M,CCFT,AoBDG,AdMO,CNLTwE,AGEU,AGGA5D,APHA,CIAC2E,AYAV,AhBAU,CaDC,AJNA,AOOVlB,CPPW/D,CbSC,CAAC,EaTE,CLOC,AKPA6S,CLOC7G,CREC,EAAEvE,CyBLN,EAAE,CpBCF,AMKU,CNLT,ALIU,AaTA,AFUA,CXDC9E,AaTA,CYIN,AZJO,CYINyK,ALGH,CfFC,ALIU,AoBFV4K,CfFC,ALIUtY,EAAE,AWCA,CHHC,AREA,CQFC,AREA,AWCA,IAAI,CAACmQ,CSHT,CAAC,ITGc,CcNN,AdMOrE,CcNNA,GdMU,CcNN,AjBGO,AGGA,CcNN,AjBGO,GGGG,CcNN,AdMO,CcNN,AdMO,CcNN;ECDlE,ApBQAJ,AiBHAgC,AvBEA,ASJA,AEKA,AhBPA,AOUA,EGRE,AoBDAhJ,AjBGAkJ,AMPAvN,ADAA,EIMEyW,EAAE,AJNA1D,AOOA,AxBNA,CqBKC1G,AtBHA1L,CWOC0K,CAAA,CEHE,AMPA,AMOA,CZACe,AFGA,AQVAnM,AGMA,AGCA6X,AzBJAnX,CAAClB,COUCsI,ANZA,C6BGN,AREOsE,CQFN/H,AXJO,CAACqN,CDAC,AjBCAtO,CYMC,AeAAgK,ANDA,AfOAtF,CMNE7C,AeADiF,A5BJA,AOUD,CWbE,AjBCA,C6BGN,A9BDOzK,AOUA,ANZAyD,C6BGN,AZJO,CUOC,C3BNC,C2BMC,A5BJA,CaIE,AZNDC,CkBDC,AnBGA,CmBHCkL,CAAC,CNOGpJ,AMPF,CMOC,CAAC3C,CxBNC,CAAC,C6BGN,A7BHOe,E6BGL,AjBGS,AYAF,CZAGnB,CZND,CwBMC+V,CKHN,CAAChL,EjBGW,CAAC,CAAC,CAAC,GYAC,SKHE,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;ECAhE0Q,AlBIA,ARGA,ASJA,EJDE9X,AoBDA,AnBMA,AiBHA,AVPA,AlBGA,AOUA,AENA,EaDEoS,ArBLA,CAAC,C6BGC,AFGA,AvBGA7O,ASJAqG,AQAA,AJNA+E,AOOA,CKHCwG,AFGArP,ANDA5J,CXICsL,AXPAjL,CKOCgH,AEGA,CFHCL,AoBHA,CGAC,AHAAuQ,AxBNA,GSIJ,AkBEO3N,ClBFNzF,AHQO,EIHE,CoBPCyX,AHIA,CGJA,ArBEN,ALKO,AaVA,AXaA,CGRN,ACKO,AXPA,AOUAnV,CwBVC,A1BOArC,CaVC,AXaA,CePC,AtBHA,AOUAoD,CuBTC,AnBMA,AGJAkG,AQAA,CQFC1N,AnBMAH,ANAA,ASJD,ETIG,ASJA,AINA,AlBGAb,COUC,CAAC,EePE,AGCA,CdGC,AcHAuC,CfFN,ACKOF,AWJA,AfOA,CAAC2F,CGRN4C,IAAI,AYCO,CZDN,CoBDQ,ALGA,AzBJA,C8BErC,ALEsChI,AzBJA1C,COUC,CAAC,EIHE,CAAC,CcHC,CKFrC,ALEsC,AzBJA,E8BG7C,A9BH+CC,I8BG3C,A9BH+C,C8BG9Cma,ALC+C,AzBJA,CyBIC,GdGG,CAAC,MmBJzC,CAACpO,IAAI,CAAC,IAAI,CAC5B,CAAC;EpBDH,AGGA2B,AGEA,ATGA,EwBVE,ADIA,AnBGAvB,AiBHA,AvBGA,AcVA,ALMA,AILA,AlBEAjL,ASIA,EgBAE,CAAC,CKAC,AFAA,ANDA,AGCA,AxBNA,C6BMC6Y,AFAApO,CvBGC3D,ASJAhB,ALCAgD,CSNC,CIKC,AJLAsJ,CPSC,AWJAsD,CXICzU,CNAC,AoBHAb,AxBNAoC,CDEC,C4BIC,AdDA,AdHAzC,C4BICwJ,AvBGA,AIHA,CICCiD,CAACjD,ACFA,AWCA,CzBJC,ASIA,CmBAC,AHAA,AzBJA1K,ACFA,C2BMCiL,CfCC,AREA,AiBJA,CXIC,AWJA2B,AJLA,CYMC,AjBCA,ACFAxC,CgBCCtJ,AZNA,ATMAsJ,CEGC,AiBHA,AvBGA,CuBHC,AvBGA3C,AiBJA,AtBHA,CsBGC,AtBHA,EWOE,CAACiD,IAAI,CAACO,ENAE,CAACnD,EyBHE,AnBGA,CmBFrC,MzBE4C,ASJb,CgBExB,AhBFyBoC,ALCA,CJGc,AIHbG,CqBEjC,IAAI,AhBHkC,CgBGjC8P,AhBHkC,CAAC,ITIiB,CAAC,EIHX,CAACja,EqBEhC,ArBFkC,CqBEjC8L,ArBFkC,IqBE9B,CAAC,IAAI,CAC5B,CAAC;EpBHH,ACIA,AiBHA,AZGA4B,AhBPA,E+BAE,ADOA,AjBFA,AREA,AcVAhK,ALOAqD,ALAA,ESNE,AjBAA,CkBDC,CYGC,ADOA,AXVAgI,AGMA,AGCA,CMJCuK,ADOAM,ArBHA,CICC/L,CREC,ASHA,CAAClG,AQDA,AJLA,AOMAtG,GfDG8J,ALIA,AIHArL,CJGCkI,AiBJA,CAACyO,AGCA,CAAClN,EMJE,AfOA,CHFC,ACDA,CWAC,AhBAA,CsBJClJ,ADOA,AXVA,AHUCmK,CcAA5J,AjBFA,AMRA+N,ALOA,CKPC,CAAChL,AVOAoG,CgBAC,ATGC,CHFA,CHFCoB,AGEA5F,AREA,AiBJA,CZAA,ALIC,AcVA,CYGC,AZHA,AGMA,ANIE,CePD/E,ArBGA,EDCE,CJGC,CQFC,ACDA,ALAA,CICCyB,AREA8F,GyBAG,ALHA,CKIlC,CzBDoC,AoBHA,CpBGCE,G0BPG,A1BOA,C0BPC,A1BOAjD,CyBClC,EACP,AjBJ4C,CAC3C,ARC4C,CAAC,CAAC,CyBE3C,CAACmV,IjBHG3P,EkBN+C,CAAC,ClBM5C,CAACxK,EAAG,GiBGG,CAAC8L,IAAI,CAAC,IAAI,CAC/B,AjBHA,CiBGC,AjBHA;EFEHZ,AiBHAqC,AvBEA,AcVA,AnBIA,AOSA,EwBVE,ArBGA,AoBOA,AjBHA,AGAA,AfTA,CAAC,CaMC,ALAA,ARNA,E8BEE,ADUA,AjBHAM,AKVMyF,CaGL8F,ADUAW,A9BTA7Y,CUECuD,AICAO,AQDA,AGCA,ATGAoL,ELCElF,AOXM,ATONpL,CEIA,AVVCuB,CaMC,AQDA,AGCA,CdIC,AWLAoV,AGCA0B,CfDC,CICCpR,CEGC,AfTA,CSKC,AGIA,AeFAwG,A5BJArM,ASGA,CmBCCsJ,A5BJD,ASGCtC,ARNA,C8BEC,AlBOA,AGAA,ChBNC,CUEC,CqBHC7H,ArBGAkE,AkBEA,AdDA,CgBMC,AhBNA+C,AEGA,CcGC1G,AFLA,AZEA2E,APHA,CaDC,AbCA,CaDCmH,AbCA,GKAG,CiBJC,ATGA,CSHClM,ATGA,ANIA,CAACyB,CSHC,CAACE,IfDI,CAAC,CAAC,AoBOA,CACpC,ELPuC,CAACC,CMJC,AfOA,CePC,AfOC,CSHA,CKOpC,ALPqC,EKQ5C,GdLiDoI,CcK7C,CAAC4P,ALR8C,CAAC,CTGC,CAACpa,EAAG,CePA,CAAC,AfOA,CAAC,QcKtC,CAAC8L,IAAI,CAAC,IAAI,CACjC,CAAC;AXfL,EdWE,AEEA,EwBVE,ArBGA,AoBUA,AnBLAlB,AiBHA,AZEA,AhBNA,ASGA,EIGEiD,AZTA,E8BEE,ArBGApJ,AoBUA,AFRA+F,AvBGAtC,AiBLA,AJPYtF,AOQZ,ATGAwN,CePC+I,ADaAkB,ALTA,GGCG,CAACra,A3BPA,CSKC,ALKAkI,CuBHC,AvBGAN,AoBJA,AlBMAO,CGPC,AMIA,CHAC,AZTA,CYSCjG,AGAA,EePE,AHKA,CrBKCiG,CAAA,CwBVE9H,ADaA,CFRC,AvBGA,AEEA,CqBLCmK,CEQC,AzBLAxK,EAAE,CQDC,AeFA,CEQC,AFRAA,AvBGA,C0BRC,ADaAmZ,CCbC3Y,AlBOAgK,AFCf,AiBHe,CjBGdU,CiBHgB,EfEE,CAACH,KiBMK,AjBNA,CiBMC9I,AnBLf,CAAC,EoBRiB,CAAC,CpBQd,CAACuI,IAAI,CAAC,EmBKiB,CAAC,ICbI,CAAC,MDaM,CAAC;AXhBpE/H,EYIC,AtBIA,EqBSE,AjBNA,AFCA,ANAA,ALPA,AOSA,ANZA,ESKE,AkBEA,AdDA,AQDA,AJRoB,AFYpB2N,CGXL,AGOM,AJRoB,CPanB,AQZPgF,AGOO,CXKC7P,CiBHC,AvBGAwC,AaboB,AOSpB3G,AzBHAD,AOSAuI,CqBLCgC,ElBFE,CMIC,CXCC,AWDA2E,CLCC,AOboB6C,CPanB1Q,AcJA,AlBMA,CFFC,AoBJAnB,CfDCgJ,AkBEA,CAAC,ArBKA,EYdnB,ADDyC,CPanB,AOboBkJ,AOSpB,CdIC,AiBHA,AvBGA,AoBJAlS,CdIC,AiBHAwX,ATTxBzD,CZcyB,CWfqB,CbanB,AaboB,CRQzB,ALKM7N,AaboB,AOSpB,ATGA,CNJLtE,AeCM,ATGA,AhBNA,AOSA,CAACoE,EGPJ,AVFMjG,AOSA,CGPLqD,AHOM0D,GqBLG,CAAC,CTTrC,CTOiC,ALKM,ALPA,AOSA,CGPL,ALKMP,ALPAvG,AOSA,IAAI,CPTC,AOSAuG,IFFI,EAAE,GEEG,CAAC,OFFO,CAAC;AIHhE,EsBHE6U,AlBMA,AFCA,AVVA,ESKE,AoBUApc,AFRA,AvBGA,AEEA,EONE,AQDAwW,AJRA,EIQE,AGCA,ATGAvG,CMJC/N,CRCCgM,AITA+E,CbaC,AEEA5J,CuBGC,CAAC9I,CZlBC,CbaC,CAACoH,AabA,AFYA,EFHE,AEGA,ATGA,CwBTCyU,AxBSA9S,CwBTA,ATEC,CRCC1J,AQDA6W,CSFC,AxBSA,CePC,AfOC9R,CePA,CRCC,CAAC9E,AEGA,CTGE,EuBGC,AzBLA,CyBKC,AzBLA,CEEG,IONE,APME,COND8E,ETIE,CyBKC,AvBHE,CFFD+C,ASJA,APME/C,CuBGAnE,ChBTA,CAAC,CAAC,APME,CFFD,AEEE,CuBGA,AzBLDqH,AEEE,IuBGI,EzBLA,CAAClI,EAAE,CAAC,CAAC;AMCzD,AFLCyC,EIKCiL,AeHA,AvBGA,AEEA,ANXA,E8BEE,ArBEA,AYAA,AtBFA,CsBEC,CQUC,ARVA,AGCA,ChBDL,CSRO6E,AFYAhC,APJPlG,CRJQzG,C8BEC8Y,ADYApC,CpBVC,CDAV,CsBFY,AfMA,CcMC,AZlBA,CRQC,AQRAvT,AFYA,APJdsD,ARJczG,C8BEE,ADYD2W,A7BdA1W,GQIf,ARJkB,CYSC6J,CAAClD,AZTA,CiBJC,AFYA,EcME,AZlBAgI,CLaC,EAAE,KKbK,CAAC;AaOjC,ApBMC/P,EDJC,AkBGA,AvBGA,EQDE,ASLA,AGCA,AzBHArB,ACFAsB,CwBKC,CKUC,AhBVA,AWAA,CdGL,CECO,AFDP6I,AiBDOyN,AvBGA7Q,AiBNA,AJRAkL,AFWgB,CMHfjT,CQWCS,C9BbC,CaOC,AbPAQ,ACFA,CYSCmJ,AZTA7H,CIUCwF,C0BRCzF,ADaA,AzBLAkF,CyBKC9G,A7BfA,CYSC,AbPA,ACFA,C2BOCkY,ANHA,CQWC,AjBNA,AeFD,ANHCzW,CXIlB,AXNmB,C4BKC,AVXA,CjBIC,CUQrBgJ,CmBOuB,AzBLA,AadA,AjBIA1H,EIUE,CJVC,CiBJC,AjBIA,EqBIE,CAACgT,CtBFQ,C+BAhB,ATEU,CSFT/S,ATEU,CQWC,AnBPlC,EmBOoC,KCbL,CAAC,CAAE;AACnC,ErBGE,AYDA,AfOA,ANXA,E2BOE,AvBGA,AoBLA,EZIE,ACJA,AdJiC,E8Bc/BwW,AFRAvP,AVXA,AOSA,ATEAyF,CNFCjM,AeAAkT,CpBKC1P,ASLAyG,EgBUE,AjBNAV,CeFC,CdFC,AEEA,CeLCpL,ADaA,AzBLA,ALTwBpB,C4BMvB,AZAA,CFFC,CTKC,AoBLA,CKUC,ALVA0K,AzBJoB,C8BcnBqO,AFRA,CAAC9U,AdFAkJ,CdJkBlN,EKSf,CKLCgD,AIAA,AEEA,CNFA,AIAC,AWAA,ATEC,CFFAgK,AWAA,CfAC,AkBEA,AvBGA,CuBHCrM,AvBGAqF,EQDE,AbRQ,CAAA9H,C+BChB,ANGU,CMHT8D,ADaU,AjBNA,CCJC,CAAC,CgBWxB,CjBP0B,ACJA,AdJC,CaQAgC,CkBPT,AHKU,AvBGA,ALTP/D,C+BCF,ADcf,AFTyBsP,AvBGAlJ,C0BRR,ADchByS,E9BfoB,C4BMQ,CfEC,AeFA,CfECpY,AeFA,GvBGG,CLTbR,CKSe,IyBMrB,A9BfM,C8BeL+Y,A9BfKlZ,GaQuB,CACnD,AbT4B,EKS0B,CAAC,ALT3BI,IAAA,CaSrB,IAAI,CAAC8I,AbTgB9I,C8Bea,GACtC,AjBPa,AbTY,CaSX1B,EAAG,AbTQsB,C8BgBrB,CAAC6X,AjBNX,CAAC,CbV8B,EAAAzX,IAAA,G8BgBT,CAAC+Y,iBAAiB;ACd9C,ATEA,AfOA,ENVE,ESIE,AkBEA,AvBGA,EQCE,AKfA,AOSA/X,ATEA,CAAC,CcUC,AFVAqI,AdHgChL,AEGhC,AhBPyByB,CCCxBsC,CYUCgK,CHNCpL,ALKA,CyBOC4X,AhBbgC,AdJP,C4BOxB,A5BPwB5Y,C4BOvBjC,AdHgC,CiBF/BiD,A1BQA,CyBOC,AzBPAsF,CLVqB,ACCpBlE,C6BgBC,A7BhBD,E2BMG,A3BNA,CDDiBvC,GyBKvB,CGEW,AHFVwC,CGEW,EAAE,ClBFT,AGMU,ARDA,CKLTd,ALKU,ALVO,CaWN,AbXMvB,E+BEd,ArBGA,AeAA,CMHC6C,ArBGA,AeAA,CzBLa,GKUC,AoBLV,CAACkT,CpBKW1P,KAAK,CAACI,EoBLR,CfAC,AeAAyO,CMHC,ArBGA,CqBHC,CAAE,A1BQS,CAAC,CAAC,CAAC,KoBLL,CAAC,CAAC,CAAC;AMFrD,ATCCnU,AfQD,EGNE,ALKA,EoBLE,ATEA,AfNA,CwBIC,CGECsI,AdJ2D,AIN3D,AOQA,AzBN+B,CcI6B,AQAjE,CTQO+C,ACR2D,AQAlEwI,EQcS,CFVC,A3BNA5T,CqBEV,AJNW8Q,EYoBE,AFVA,CGLCvT,ATCdqW,GQciB,AFVA,CGLC,ADeA+D,AFVAxB,ANJlB,ArBFkB,C8BCC3Y,A9BDA+C,CiBJC,EjBIE,CiBJC,AjBIA,GYUG,CAACd,AKdAsR,CaKC,CAAC/Q,CHKC,A3BNA,CAAC,C6BgBC,EACrB,EjBPyB,CAACF,CiBOtB,AZrBuB,CYqBtB6X,AZrBuB,CAAC,CAAC3G,ELcE,CAAC,GkBTP,AbLU,CaKTtP,AbLUxB,KYqBlB,AZrBuB,CYqBtBT,AjBPuB,AKdA,CLcC,QiBOf,CAACK,EChBe,CAAC,CAAC,CAAE,CDgBb,CAAC,OAAO,CAAC;ACfzD,AxBSA,CwBTC,CrBIC,ALKA,AWJA,AfNA,CeMC,CSFC,EZME,AeJA,AdJA,AINA,AlBEA5C,EKYEwI,AoBNA,CAAC2P,CKaCuC,AFXA,AdJAzW,CcIC0B,CVVCoO,CbcCvL,ASRA,CgBeC,AzBPAR,CKLCwD,AoBYAjJ,ChBfCuB,CINC,CUUC,CAACvB,AdJA,AWEA,CXFCuM,AINA,AOQA9N,AzBNA,CkBFCwS,AlBEApS,EKYE,CyBOC,CAACoB,AzBPA,ALZA,CAACZ,E8BmBE,AFXA,ClBDC4J,AoBYA,AFXAhJ,ClBDCoI,AVPA,CAAC,C4BQC,AVVA,CUUC,ClBDC,CIHC,AINAgJ,CRSC,AoBYA,AhBfAhF,AWEA,CKaC,ALbA,GGEG,AdJA,CcIC,AdJA,GING,AOQA,EPREoF,AOQA,IAAI,CPRC,AOQA5S,CPRC,GOQG,CPRC,AOQA8K,CPRC,GOQG,CAAC,IAAI,CAAC,CAAC;AlBOnE,ESHEiE,AfNA,E8BAE3O,ArBIAsB,AGKA,AeJA,AvBIA,AoBNA,CGEC,CdHC,AIPA0Q,AlBEA,EyBME,CAACgF,AxBHArU,C6BgBC,AzBPAgE,ASPA4G,CiBFC,AHKA,AdHA,CiBFC1J,EDgBE,AhBdA5E,AEIA0P,CeNC,ADgBAsK,AzBPA,AWHD,CeNEqC,CbLC,AFWA,AfNA3Y,CISC,AJTAC,C8BAC,CAAC,AbLA2P,ERSR,AIFU,CJETnP,AIFUoK,AbFA,CISC,CadC,AjBKA,CiBLCiF,EbcE,AoBNA,CKaC,AzBPAtM,AadA,AOQAjF,CPRC,CAAC,CYqBCgY,IAAI,AhBdA,AWCA,CKaC,AhBdA,CgBcC,CpBZT,AeDU,CfCT9P,ALKU,ASPA,CTOC5C,ASPA,GJEP,CAAC5H,AeDU,EfCR,CAAC,CeDW,CpBMC,AoBNAwY,EpBME,WAAW,AoBNA,CpBMC,AoBNA,CAAC;AlBOjE,EwBTE,ErBIE9T,AGKA,ARAA,AoBNA,ATGA,AfNAhC,E2BKE,AdHAiM,AINAgF,AlBCAxS,CcKC,CAACwC,AWCA,CAACtB,CKaC,AjBPA0L,AeJA,AZCA8B,CYDCtK,AvBIA,AabA,CJMC,AINAkH,AjBIA,CAAC9J,C6BgBC,CAAC0X,AzBPA,ASPAxW,CJEN,ALKOmE,AJTA,CSINjD,ATJO,C2BKC,AdHA,CcGC5C,AVTA,AFUA,CEVE2R,AOOD,CfCN,AeDOxR,CfCN,AMEOjC,EHGE,AKbC,AjBID,EDHE,ACGA2D,CYSC,AbZArC,C4BQC,AVTE,AOOF,CKaC,AFXAa,AvBIA,CyBOC6N,AzBPA,AWHA,CHGC,AYNA,ATGA7P,AfNA,CYSC+E,AbZA,ACGA,CDHCnE,E4BQE,ClBDN,AkBCO,CHFC,CfCNoJ,CGKQ,CAACvI,AbZA,CKYC,AoBNA,CfCN,AeDOlB,AzBNAS,CUON,AkBCO,AvBIAuG,CyBOC,AFXA,CEWC,AdVA,CSHC,ATGA,AhBTA,CyBMC,AzBNA,CKYC,AoBNA,CpBMCK,IQAI,CAAE,ARAD,CAAC,CAAC,CAAC,CWHC,CAAC,GHGGoC,IAAI,CAACxK,EAAG,EAAC,CAAC;EkBPtE4L,ArBGA,ALKA,AoBNA,AlBMA,ANTA,EYSE,AeJA,AZCAiE,AhBTA,CAAC,CcKClB,CAAC,CiBDC/C,AlBQAmC,ACPAc,AINA,CaKA,EAAG,CDeCyB,CdVC,CEVCyD,AFUA5R,CTGCyH,COPC,GAAG,CgBcC,EAAE,AjBPA,CGHC,CHGC,AGHAuG,EEVE,GAAGlQ,CYoBC,AdVA,CAAC,EEVE,AXaA2J,CWbCvG,AXaAwG,KOPK,AINA,AFUA,CEVCiK,AFUA,GTGG,CWbC,CAAC,AXaA9T,EAAE,EAAE;EGH/C,ALKAgI,AoBNAhH,AzBPA,ACIA,E8BAE,AHIA,AZCA,ATGA,EMAE+M,ACPAY,AWEA3N,CXFC,AWED,CMHE,AjBCA8N,AINA,AFUA,CeLCmN,ANGA,ATEAnM,AfLA7L,C2BICuG,EEWE+F,AZpBAuD,CJMC,CcGC,AdHA,CJGCtP,ALKAwD,ASRA,CiBDC,A1BSAjI,AadA,CaKC6L,ADeA,AFXA,AVTAkF,EYoBE,CjBPC,ARCA,AWJA,CHGC3O,AKbA,AFUAsO,CXIC1J,AadA,CaKC,AHIA6D,AVTA,CaKC,A9BAA3G,C8BAC,AbLA,AjBKD,CeKE,CAAC,AfLA,CeKC,CXIC,CQDC,CHJCO,AGIApC,ARCA,CKLCqC,EGIE,CAAC,GHJG,EAAE,KGIK,CAAC,KeJV,CAAC0G,cAAc,CAAC,CAAC;EZEnD,AhBRA,E+BGE,ArBIA,AGIA,AeJA,AvBKA,AoBNA6L,AlBKA,ANRA,EaCEtT,EiBDE,AHIA8G,CGJC0R,AjBCA,AdJAta,CUOC4I,AoBWA,AhBdAuE,AINA,AXaAxH,CuBOC,AzBNA,AJTA7E,C6BeC,AFXA,CEWC,CpBXC,AoBWA,AFXA,CvBKCkE,E0BTE,ArBIA,CqBJCgF,ANGR,CAACqL,AxBHQ,CAAChU,CMQC,CFCC,CKLCoH,ALKA,AoBNR,AxBHQ,C8BAC,A1BSAxD,AoBNR,AlBKQ,ANRA,C8BAC,AjBCA,AWER,CMHS,AjBCAhD,GAAG,CAAC,APOA,CFCC,ALZAjC,CAACP,CUOL,ALKMyF,CKLL7D,AHIM,CAACsE,EGJJ,AVPM,CUOL9C,CLKO,ALZA,ACGA,CAAC,ISIF,ALKM,CKLL,CHIO,CAAC,UAAU,CAAC;EwBPxD,AfMAuL,AfNA,ESIE,AGIA,ACPA,AWEA,AzBNA5O,CcIC,CcGC,AvBKA2F,EKLEyD,AoBWA,ALZA,CAAC4L,CPRC,ClBEC,CUOC,AkBAAxL,A5BPA/I,CKYC,CKLC,ALKA8F,AadA,CAACqM,AFWAhE,CAAA,ChBTE,CgBSC,AhBTA,CyBMC,CAAC,CAAC,EpBME,GAAG,MAAMnJ,ALZA,CkBFC,AlBEA,CkBFCkN,KbcK,CuBLd,AvBKehN,CuBLd8D,KVToB,CbcC,AadA,CbcCvD,GuBLZ,CAACkD,EvBKiB,CAAC,CuBLd,EAAE;EGFzCmB,ANEA,AxBFA,EYOE,ACNA5E,AEIA,AhBTA3F,AOWA,EGJE,AoBWA,AzBLA2F,CyBKC,CjBPC,AeLqCgE,CfKpCP,AZPAtG,CiBNCmO,CJOC,AdLA,CUOC,AIFAnL,AdLA7F,C8BkBC,AjBPA,AREA,AWJAqP,CXICxJ,EKNE,AGIAsD,CHJCY,AoBWAvK,A9BlBA,CAACQ,CcKC,CiBDCsK,AlBOA,AKbA,CaMA,A1BSC,AafA5E,CYoBC,AhBbA,CiBDC,ADcAjG,A9BlBA,CKaED,ALbD,ACIAqD,CeKCwM,AfLAvM,C6BcC,AdTAwM,EEXE,CbeE,CafAoD,CRSC,AoBWA,CpBXCvJ,AIFA3J,AEIA,CXIG,CWJD,ENFE,CAAC,AIFA,AbDA,EaCE,AbDA,C6BcC,EAAE,AZpBA,CAACf,OAAO,CAACW,OAAO,CAAC;ELczD,AYJA+X,EMHE9T,ArBGA,AVPA9E,AOWA,ANPA,E2BC+C,AdA7CwB,AEIA,CYJ8C,CEa5CmZ,AFb6C,AvBQ7C,AafA,AjBMApW,EMOE2F,GONG,AEIA6G,CXICtP,ASRAA,CWECmX,AlBIA,CwBPN,ADcO,ALXD,CMHL7T,CNGQ,AzBPA,AOWA4C,CuBOC,AzBLA,ASRA,AEIA,AhBTAvG,CcKC,AEIA4P,AfLA,EISG,C0BTP,ADcO,A9BlBA,C+BIN,ADcOyJ,A9BlBAhZ,CCIC,EeKE,AfLA,CeKC,ChBTC,AOWA,ANPA,CDJC,AOWAyI,IFEI/J,CEFC,CAAC8J,EwBPL,ADcO,AzBLC,E0BTN,CDerB,ChBd8B,EiBDL,AjBCOhJ,CiBDN6M,ADetB,AvBR6B,CuBQ5B2M,AvBR6B,GONG,AEIA,CFJClT,CEIC,KFJK,CAAC6H,AEIA,CAAC,CAAC,CcU5B,AzBN6BnO,AWJA,CcU5B6Z,ECfwB,CAAC,C1BSQ,CAACvT,ASRA,CAAC,KTQK,CAAC9F,KAAK,CAACvB,IyBMzB,GAC1C,AzBP2E,EAAC,EyBOxE,CAACqZ,WAAW,CAACwB,gBAAgB;EpBZ3C,AGKA/O,AbZA,E+BIE,AHCA,AdAA,AWEA,ATEA,ATEA,CqBNC,AdAA,CIPC,AjBMAzH,CiBNC,CYsBC,AjBRAyH,ARCA9E,AafA,AOSA,CZKA,AYLCkQ,ClBICjQ,CMCC,AePA,CEeCwT,EzBPE,CAAC,EEFE,CNPC,CISC5T,CyBOC,AvBTAmD,CNPC,C6BgBC,CLbP,CpBMS,AoBNRvG,CpBMStD,AEFA,ANPA,CMOCkI,GFEG,CAACjI,AoBNR,CAAC,CAAC,AlBIQ,CAACF,CkBJP,ClBIS,CAAC,GFEG,CAACqB,KAAK,CAAC,CAAC,CAAC;EKJ9C,AIHA,AdJAL,E+BGE,AlBQA,AKdA,AFWA,ATGA,ANRA,E2BCE,AvBQA,AoBNApB,AzBNAoB,CKYC,ALZAlB,C+BGC,CAACwZ,CDgBC,AjBRAtL,AGHA6C,CTGC,CqBPCjG,EEeE,A9BnBA,CUOCS,AMCA,ATGAzE,CPXC,E8BmBE,AdXA8J,CcWC2J,CChBC,CAACzZ,CxBQC,CMAC,ANAA,CAACiG,CGJCwE,CAAA,AGICT,EHJE,EMCE,CAAC,ATGA,EuBQE,AvBRA9D,EuBSrB,AdZuB,CSFf,ATEgBgJ,CeLC,ANGhB9O,CMHiB,CDiBtB,AvBTuB,CuBStBqZ,AFhBQ,CAACvP,AHED,CAAC,ElBKkB,CwBRC,EAAE,AfKA,CAAClI,GeLG,AHCf,CGDgB+Z,AHCf,CZIgB,CcYtB,AjBTQ,AGHe7L,CcYtB3O,AjBTQoC,GGHkB,CAAC,CAAC,CAAC,CAACqM,CeLC,CAAC9E,ADiBvB,CAACtJ,GCjB0B,CAAC,AfKA,CAC/D,CcW0C,AjBTQ,CiBSP,AjBTQ,CkBRgB,AlBQf,CkBRgB,CAAC,CfM/D,EACN,CcUkD,CAAC,EdTrD,CAAC,WSLyE,CAAC;AXD/E,IiBDI,ArBIAE,AGIA,ARCA,AadA,AOQA,ATKA,AhBXA,ACGAA,CISC,AoBNA,CpBMC,AEDAqE,EwBRE,AlBQA,AeR+BgE,AVL/BqI,CaKCgG,AlBQA7T,CiBSCgV,AdTAxJ,CSLC,CxBHC,CMQC,ANRApO,CMQCgF,EMAE,AZRA,CYQCsF,AZRA,C6BiBC,CAAC9K,AZtBA,CAAC2O,CaKC,CAAClQ,ArBIV,AMIU,CNJT4D,AHIU,CWbC,CAAC,AFaAqM,CHAC,AKbA,AXaA,EuBSE,AZtBA,CYsBCzO,AjBTA,CGAC,CHAC,AGAA3C,CcSC,AvBTA,ANRA,C6BiBC,C7BjBC0E,GeQG,CeRC,CAChC,ArBGuB,CAAC,AoBaU,AdTA,CcSC,AdTA,CAAC,CAAC,CNJT,CAAC,CTJW,CAAC,E8BC/B,EACV,IAAI,CAACyY,cAAc,CAAC9Q,IAAI,CAAC,IAAI,CAC/B,CAAC;AjBFJrJ,EiBGC,A1BMA,AJTA,ESIE,AGIA4H,AGAA,AhBXA,E4BEyC,AVJvCgI,AOQA2E,CGJwC,AdC7C,CgBiBO,AFlBuC,AdC9C7I,APQO,EGJE9D,AMIA2G,AhBXAlP,IaWF,CAACqG,AGAM,AhBXA,CkBFC,CAACpB,CFaC,AhBXA,EUOJ,AeDF,CfCGqB,AGIA,AYLF6O,CZKG,AGAMhG,AhBXA,CaWL,AbXM1Q,CaWL8M,AKbM,COQP,CfCG,AQTM+F,AOQR,CfCG,AIJpB,AWGkB,CfCG,AGIA,AGAM,CHAJnF,AGAK4C,CFR5B1C,CdH8B,CAACpM,EaWH,AGAK,EAAE,CEbC,CLaH,AKbI,CFaC,CAAC,CAAC,AhBXA,CgBWC,AhBXA,IAAI,CAAC,EcG9C;ATUD,E0BLE2L,A9BHA,ESGEhJ,AkBLA,AVJA,AOQA,ATKAtD,EHAE6M,EiBSE,AvBTA,CNPC7J,EYOE,AGAA,CcSC,AjBTAqI,AGAAxH,CcSCoV,CvBTCtQ,CSAC,CNJN,AMIQ,CNJPhF,EGIS,CkBJC,AlBICyF,CHJP,CAAC,AHIO,CwBJEA,ClBIC,CNAAzD,CSAC8J,CeJE,ADaD,A7BhBAzM,CYOG,AZPH,E6BgBGmW,A7BhBA,C8BGG,AfID,CTAA,CSAC,ATAAjT,CSAC,ENJL,CAAC,CoBaQ,CAAC,AvBTA,CuBSC,AvBTAqC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;AFCpEvC,EKJC,AkBLA,AVJA,AOQA,EMCE9B,AfIA0J,AhBXA,ACIA,GIOH,CyBSO,AjBTA,ARAPhE,AEAOQ,EwBJE,CAACgW,A9BHAna,C6BgBC,CAAC2X,CjBTC5O,AGAN,CAACtD,ATAM,CFAd,AEAe4B,EwBJE,CAAC+S,A1BIlBzW,AJPkB,CAACpD,CeOL,CHAO,AGAN,CAAC,AfPM,CeOLoK,ATAM,ANPA,CYOC7C,ANAA,EuBSE,AzBT1B,C0BJ2B,ADaA6F,AdTN,CeJO,AlBIA,AGALpC,CeJM,AlBIAjO,CkBJC,ClBIC,CkBJC,CfIJ,CeJM,EAAG,AlBIDgO,CGAH,IcSQ,A7BhBA,C6BgBC,A7BhBA,I8BGIxD,GlBIG,CkBJC,CAACxK,EAAG,EAAC,CAAC;ArBCzD,AkBLA,EGKE,AbRAiU,AOQAoE,AxBHA,C8BGC,C/BPC,EgBWE,ATAA,CWZCpE,AXYA,CMAC,AKZD,EYqBG3D,AZrBA,AlBCAtO,EaWE,AGAAkP,CHACvD,CYJC0K,CAAA,EAAG,CKaC,CdTC,CcSC,EdTEpK,CHAC,CAACzD,GGAG,CcSC,AjBTA,AGCnB2G,ChBZoB,CaWC1F,EbXE3J,EgBYjB,CAAE0I,EhBZoB,CaWC,AbXAvI,CaWC,AGClB,IAAK,QhBZyB,CAAC,eAAe,CAAC;AUOnEQ,AkBLAA,EGOCka,A9BHA,EiBNE,AOQA,AzBPA,EaWE,ANAA5V,CGLL,AGKM,AeVN,ClBKA6D,AGKO,AeVPgO,AVFO,AOQA,ATKE,AhBZF,CyBOCZ,AzBPAhW,ACKAqC,C6BeCkM,EZrBE,AFaEa,CeJD,AbTAe,AXYA,CAACjL,CuBSC,CCZCyV,CAAA,ADYC,AFnBhB,AHMgB,ATKE,CSLD/Z,EGNjBgW,AZWqB5H,CNNrB,AHKoB,CwBHC,CNDC,CfDtBpG,AHKuB,CSCG,CSLDlI,ATKE2O,CfPDhN,CiBNC,AlBCA,ACKAC,C2BJ3B,CVF6B,AFaE,AhBZF,AOWA,CSCGkG,IAAI,CAACO,CNNrC,IMM0C,CAAC,CfPD,CwBET,CAACxH,AxBFU,MwBEJ,CAAC,CAAC;IMEvC,ANDA,AxBFA,EYME,AKZA,AlBCAnC,E+BQE,ADYA,AdRE,ATDF0F,ANNAxC,C8BGC6X,ADYA,CAAC,AjBTAhQ,AKZA,AOQA7H,CKaC,AZrBA6N,CYqBC,AdREpB,ChBZD,CAAC1P,AOWA,CAAC0F,GwBHG,CAACkN,A/BRA,CAAC,EOWE,CAAC5S,ANNA,C8BGC,AfIE,CeJD,ANDA,CMCC,AbTA,AFaE,CEbD4S,COQCvR,AlBIA,ANNA,CMMC,CNNC,EiBNE,AjBMA,CiBNC,CLYZ,AKZa,CLYZ,WYJc,CAAC0B,KZIE,CAAC,YYJe,CAAC,CAAC,EzBPY,CAAC;I+BSlE,AlBGA,AKZA,AOQA,CZIC,CiBSC,AjBTA,AbXA,AOWA,ANNAE,CMMC,CwBHC,ANDAA,CMCCyY,CfIG3L,KAAK,IeJE,CAAC,AfIEJ,CeJD,A9BHA,EwBEE,CxBFC,CwBEC,ATKE,CAACK,EfPA,EeOI,CAAC7G,IAAI,CAAC/J,OAAO,CAAC;EHA5C,AKZA,EaSEW,ADYA,A9BpBA,AOWA,ANNA,C6BeC,AvBTA,CuBSC,ALbA,AlBIA,ESCI,ESLA,CMCC,ANDA+W,CMCClT,GAAG,CAAC,eNDe,CAACrC,CMCC,CAAC,GNDG,GAAG3C,IAAI,CAACC,SAAS,CAACoE,eAAe,EAAE,CAAC,CAAC;EMExE,ADYA,AjBRAqJ,AKZAqG,AXWA,CwBHC,CNDC,AxBFAtR,IeOM,IHAEiL,AZPA,CYOCnD,AZPA7H,EeOIyO,CfPD,CYOC,AZPA,EYOE3F,CKZCuI,AFYE,CEZDhP,IAAI,ELYE,AKZA,ELYE,MZPM,EAAEV,eAAe,CAAC;E8BKnDsY,ADYA5C,ALdA,AxBFA,EYOE,AKZA,AlBAA,EgBYI,CAAC,CEZD,AFYE,CEZDhV,AFaA2E,CHDCuE,EGCE,CEbC,AFaC1D,CEbA0J,EaSE,CfIE,CcQA8F,CCZEnZ,ADYDf,EdRI0K,CHDD,EkBHG,ClBGA,AGCE,CcQD,AdRExK,EeJE,ADYF,AZrBA,AFaE,CHDDuL,AGCE,CEbD,yBLYW,CAACf,IAAI,EAAE,IAAI,EAAEiB,QAAQ,CAAC;AYJ/D,ElBIE,ANLA,E8BGE,ADYA,AjBTA,AbZA3J,EkBAE,AFaA,EeJEjB,AlBGA,CAAC0E,AbZA,ACMAhB,C6BeCqW,AdRA,AhBbA3Y,CgBaCsD,EeJE,CAACzE,ADYA,EjBTE,CkBHC,ADYAhB,AjBTAyC,CGCC,CAAC+J,GeJG,C/BTC,C8BqBC,A9BrBA,C8BqBCsO,A7BfArW,CAAA,EYMG,AZNA,C8BGC,ADYA,AjBTA2J,IkBHI,CAACrN,CfIC,CAAC,GeJG,CAACmc,ClBGC,CAACzX,KbZK,C+BSC,A/BTA,CaYC,AbZArD,C+BSC,AlBGA,GGCG,CAAC,CAACuK,KhBbK,EgBaE,CAAEC,AhBbD5M,IgBaK,GhBbE,CgBaG;ASNxE2C,ElBKC,EuBUE,AjBTA,AKZA,AlBCAT,ACKA,E8BGE,CNHL,CAAA8V,ATOO,EeJE,ADYArX,CCZCwc,AlBGA/O,AZNAxL,CeOCwO,GTFGlH,EuBUE,EdRE,AfPA,C6BeClK,AdRAwR,AfPArO,CMKC+G,CwBFC,ANHrB,AlBKoB,CwBFE,AlBGA,AbXA,ACKA,C8BGC,A/BRAhK,AOUA,ANLA,CwBAvB8X,CzBLyB,C8BoBC,CAACrX,AdRA,CAACiM,AhBZA,IgBYI,AhBZA,CgBYC1H,AhBZA7E,C8BoBC,GdRG,CSPrC,ATOsCH,AhBZA,ACKA,CDLC,ACKA,CeOC,AhBZA,CgBYC,EAAE;EHA1C,AZNA,E8BGE,ADYA,AZrBA,AlBCA,AOUA,IAAIuH,ESEE,STFS,GAAG,MAAM,IAAI,CAACF,EAAE,CAACE,WAAW,CAAC,IAAI,CAACK,SAAS,EAAE,UAAU,CAAC;AME3E,EkBHE,A9BFA,C8BEC,CDYC,AZrBA,AlBCA,AOUA,IPVI,AOUAG,CNJCvD,C6BcCjE,AZrBA4T,AFaAzH,EhBZE,CAAC3M,AOUA,CSEC,CAACoC,CTFC,CPVC,C8BoBC,C9BpBC,E8BoBE9B,CvBVCkH,ESEE,CAAC/E,AfNAgC,CAACC,G6BcG,CAACjE,CdRC,CEbC,AFaA,AfNA,CMIC,CAAC+G,ANJA,CiBPCvC,IAAI,CAACkP,AFaA,CAAC,GcQG,CAAC,AvBVA,CAACpM,QWXQ,GAAG,AXWA,CAAC,EWXE,EXWE,CAACF,KuBUK,CAAC,GvBVG,CAAC;AMCxEnF,EkBDCsa,EDWE,AZrBA,AXWA,ANJA,EDNE/a,CaUL,CAAAoL,AGEO,AfNA3I,CeMC,CcQCoW,AZrBAzG,CXWCrM,CwBDCgV,CAAA,C9BHE,C8BGC,AfGA,CHFd,ANAe,CAAC5U,EMAhBiF,AZJkBjK,G6BcG,CvBVC,CAAC,CuBUC5C,A9BpBA,AOUA,CPVC4B,CaUzB,CZJ2B,EAAE,CiBPC,EYqBE,CAAC1B,AZrBAuE,ClBCC,CAAC5C,EkBDE,CAACiS,AlBCA,CAAE,C8BoBA,CAACtS,SAAS,CAAC,AZrBA,GAAG,CYqBC,A9BpBA,C8BoBC,CZrBC,ElBCE,CAAChC,IAAK,EAAC,CAAC;EOWlE,EwBDEsF,ADWA,AZrBA,AlBCA,ECMEZ,IiBPI6P,AFaA5H,EeHH,A9BHK,C8BGJlH,CfGM,CAACrD,AfNA,IAAI,K8BGA,AfGK,CeHJ,AfGKC,GAAG,CeHJ,AfGK,CeHJkX,ObVY,AFaA,CAAC,EEbEtU,CaUJ,CAAC,CAACS,CbVM,CAAC8O,SaUI,CAAC,IAAI,CAAC6E,KbVU,GAAG,GAAG,CaUJ,CAAC;AxBEpE,IwBDI,ADWA,AZrBA,AjBOA,I8BGI,AfGA,CeHCA,CDWC0B,AZrBAtG,UYqBU,CCXC,CAAC/D,CDWCoK,ICXI,CAAC,CAAC,MDWM,CAAC5Y,GZrBG,GAAG+C,IAAI,CAACyP,EYqBE,CAAC,UZrBU,GAAG,EYqBE,CAAC,AZrBA;AXWjEhS,EwBAC,EDWE,A9BpBA,ACMAC,EeME,CAAC,ATHN,CSGO,ATHP0G,EuBWS2R,E7BdE,CAACpY,GAAG,CMGf,ANHgB,C6BcC,EvBXjByG,CuBWoByR,QvBXpB,GNH+B,C6BcC,CAAC5Y,A7BdAwC,MAAM,CAAC,M6BcM,CAAC,oBAAoB,CAAC;ECTnEyY,A9BJA,E6BcE,AZrBA,AFaA,AhBZA,CgBYC,CAAC,IcQIlC,A9BpBA3Y,G+BUG6a,CAAA,EAAG,K/BVK,C8BoBC,E9BpBEpb,C8BoBC+Y,I9BpBI,CAAC5Y,O8BoBO,CAACA,K9BpBK,CAAC,O8BoBO,CAC7C,oB9BrBkE,CAAC,Q8BsBrE,CAAC;A7BfL,EeME,EeFEoD,AbXA,AlBCAhD,MkBDMqS,EaWH,CAACpP,E/BVO,CAAChD,OAAO,C+BUJ,CAAC,AbXK,ClBCC,EkBDE0C,CaWJ,CAACsU,EbXO,AlBCA,CkBDC3E,GlBCG,CAAC5T,I+BUD,A/BVK,C+BUJ,A/BVK,C+BUJ4E,AbXK,AlBCA,GkBDG6O,SaWI,CAAC,IAAI,CAAC4E,YAAY,CAAC,CbXM;AjBO1E3W,E8BKC,AfGA0N,EcSE,AZvBA,GjBMH,CeQOA,AfRPzN,CeQO,CEdEkS,CFcC,KEdK,AjBMf,GiBNmB,AjBMnBlS,QAAA;AiBLD,IYuBIoY,AdTA,AhBbA,IgBaI,CEdC9V,AFcAO,IEdI,CYuBC,AZvBAvB,CYuBC7B,CdTC,CAACA,EEdG,KYuBI,CAACC,CdTC,CAAC+N,CcSC,CAAE,GAAEyK,CdTC,CAAC,EcSG,SdTQ,CAAC,KcSK,CAAC;AZtBpD,EaWE,EDYEG,AdTA,AhBbA,IgBaI,AhBbA,CgBaCrL,AhBbArP,G8BsBG,CAAC6B,CZvBC8C,GlBCG,CkBDC,AlBCAxE,CkBDCqU,KYuBK,AdTA,CAAC1S,EcSE1B,EZvBG,GlBCE,CAAC,C8BsBC,AdTA,CAAC0P,EhBbE,CAAChQ,GgBaG,CAAC,ChBbC,CAAC,EAAE,OgBaO,CAAC;AEbtD,EaWE,EDYE2a,AdTA,EhBbE,E+BUEmC,AfGA,IAAI,CAAC1X,CcSC,CAAC0V,ICZIgC,CAAA,AfGC,CAAC9a,CeHC,AbXAgS,GYuBG,GAAG,EdTE,CAAC5C,EcSE,MdTM,CAAC,IEdI,CAACuD,MFcM,CEdC,AFcA,CEdC,CAAC,AFcA,CEdE;AACxD,IaWI,EfGE,AhBbA,I+BUIqI,AfGA,AhBbA,CgBaC5N,AhBbAnP,QgBaQ,CAACuC,AhBbA,C+BUC,AbXAyR,AlBCA7R,EgBaE,CeHC,AfGA,IeHI,CAAC6W,G/BVG,CAACtX,KAAK,CAAC,E+BUE,CAACc,AbXA,CAACkS,AFcA,EAAE,EeHE,CAAChE,CfGC,CEdC,AFcA,CEdC,CaWC,AbXA,CaWC,AbXC,CaWA;AbVtD,IaWI,ADYA,AdTA,AhBbA,CgBaC,MAAM,gBEdgB9L,IAAI,CAAC+P,iBAAkB;AAClD,ElBCE,E+BUE,ADYA,EdTE,EeHEvK,ADYA,CAAC2O,CdTC,CAAC5J,CeHC,GAAG,IfGI,CcSC,AdTA5M,CeHCiI,ADYArI,EdTE,CAAC,QcSQ,CAACuY,CZvBCxG,SYuBS,AdTA,CcSC,CdTC,IeHX,CAACnJ,AfGe,CAAC,UEdU,CAAC2J,EaWb,CAAC,CAAC,GbXkB,CAAC,CAAC,CAAE;AACzE,ElBEE/T,E+BSE,ADYA+Z,AdTA,EhBZE/Z,CAAA,EAAG,C+BSC8C,GAAG,CDYC,CAACqX,CCZCxY,MDYM,CAAC,IAAI,CAAC,CZvBCsC,EYuBElF,EZvBE,CaWT,AbXU6U,CaWTpR,GDYa,CAACvD,ECZR,ADYU,CCZT,EbXa,SaWF,CAAC;AbV5C,EFcE,EeHE,ADYA,A9BrBAK,I+BSI,ADYAqY,CCZC7U,GAAG,A/BTA,CAACrD,C+BSC,a/BTa,C8BqBV,A9BrBW,C8BqBVsa,G9BrBc,CAAC3a,GkBFGqU,ElBEE,C8BqBV,A9BrBW,C8BqBV,C9BrBYhS,MAAM,CAAC,CAAC,gBkBFgB,CAACsS,OAAO,CAAC,CAAC,CAAE;AAC7E,EFeE,AhBbA,E8BqBEkG,ECZEpb,EfIEqQ,QcQQ,CAACrP,IZvBI8T,AFeAzE,CAAA,EAAG,ScQS,CAAC,ECZd,AbXgB,CaWfjP,AbXgB8T,IaWZ,ADYgB,CCXjC,CDWmC,CZvBC,CAAC,CAAC,CAAE,QYuBO,wCCVjD,CAAC;AbZP,AlBEA,IgBaI,CEfC,CaaC,ADUA,IdRIlK,EcQEA,CCVC,IAAI,qBfEM,CAACE,CcQC,CAACE,QdRQ,CAAC,CAAC,OcQO,CAAClL,OAAO,CAACE,EAAE,CAAC;A9BrBtDyC,EgBcC,EeFE,AbbArB,EYuBE0Z,C9BtBL,CAAAlb,GkBDU,CAACqF,GAAG,CYuBC,AZvBA2P,CYuBCpS,KZvBK,AlBCrB,C8BsBsB,AZvBA,CYuBC,CAAC,A9BtBxB5C,cAAA;EkBAC,AFgBA,EeHE,ADUA,CAAC,CAAC,ECVEud,AfGAjN,WeHW,AfGAA,CAAA,CeHE,CfGC;EEdpB,EYsBE,AdPA,EeHE,GbZG8E,CFeCpK,CcOCkQ,OZtBO9F,CAACnR,EYsBE,CZtBC,EAAEwO,UAAU,EAAE,EFeb,CAAChH,UAAU,CAAC,CAAC;EcQlC,AdPA,EEfE,EaYE,EbZE,CAACxH,CaYC,CAACuV,CbZC,EAAE,SaYS,CAACxW,KAAK,GAAG,EAAE;AfIlC,EcQE2K,ICXI,AbZA,OAAO,IAAI,EYuBEA,CAAC/C,IAAI,EAAE;AdRzB/H,IcSG,AZvBA,EaYE,CfEL,CcSO+H,AdTP8E,EeFS,CAAC9E,CDWC,CAACxK,ECXE,ADWA,AdTd,EeFgB,CfEhBsP,EcSmB,IAAI,CAAC9E,AdTxB,IcS4B,EAAExK,EAAE,EAAE;IZrB/B,EYsBE,ECXEwK,EDWE,CAACA,AZtBAqI,CaWC,GAAG,ADWA,CZtBC,CAAChP,CYsBC,EZtBE,CaWC+G,AbXA,CYsBC,AZrBfyC,IAAI,CAAEmF,QAAQ,IAAK,UaUQ,CAAC1H,UAAU,CAAC;IDY1C,CAAC,CZrBG,IaUEC,AbVE,CYqBD,AZrBEyH,IaUE,EAAE,EbVI,CAACQ,EAAE,EAAE,GaUC;MDYrB,EZrBI,EaUAhP,ADWA,CAACwG,GZrBK,CaUD,ADWA,ECXE9H,CDWC8H,AZrBE7D,IYqBE,CZrBG,CAAE,WaUF,CAAC7C,QAAQ,CAAC,UbVsBD,GAAI,EAAC,CAAC;IYsB3D,EZrBI,EaUA,CAAC,CAAC;IDYN,ECXE,AbVE,EYqBA,CAAC+H,IZrBM4G,EYqBA,CAAC,CAAC,IZrBM,CAACyC,IAAI,CAAC,CAAC;EYsB5B,EZrBI,CAAC,CaUD,AbVE,CACD5H,IAAI,CAAErI,IAAI,IAAK;EYsBpB0I,ICZI,AbTE2E,MaSI7H,IAAI,AbTE,CaSDF,AbTEtF,GYqBC0I,CAAClD,AZrBE,CAAC0K,GYqBC,ECZE,ADYA,CCZC,AbTE,CAAC;IYsB3B,AZrBE,CAAC,CAAC,CACDC,CaQCyF,ADYA,CAACpQ,GCZG,AbRA,CYoBC,AZpBCnJ,CaQA,EDYEmJ,EZpBG,EaQC,ADYA,EZpBI;IYqBpB,EZpBIpJ,EaQAX,ADYA,CAACmL,IZpBM,CAAC/J,CaQD,ADYA,CAAC,CCZCsb,ADYA,EZpBI,CAAC9b,KAAK,CAAC;EYqB1B,ICZI,AbRED,CaQD,CAAC,KbRO,CAACC,KAAK,CACV,2CAA0CwC,GAAI,qBACjD,CAAC;EYoBPsW,ICbI,AbNE9H,MaMIlO,IDaIgW,AZnBE,CYmBF,AZnBG,EYmBA,AZnBE,CAAC,IaME,GAAGzX,kBAAQ,CAACuB,eAAe,CAAC,CAAC;IDcjD,AZnBE,CAAC,CaMD,AbNE,EYmBA,CAACiI,GCbG5H,MDaM,CAACmM,KAAK,CAAC,CAAC,CCbC,GAAG/N,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;EbLzD,EYmBEvD,ECbE,GDaG,CAACsa,eAAe,CAAC,CAAC;AZlB3B,EYmBE,ICbI,IAAI,CAAC+B,WAAW,CAAC,CAAC;AbNvBza,EYqBC,ICdI,CbPL,CYqBO2X,AZrBPlI,SAAA,GAAAA,IYqBuBkI,CAAA,EAAG,EZrB1B;IYsBG,ECdE,IAAI,ADcA5P,CCdC4S,GDcG,GAAG,MAAMxS,KCdK,CAAC,sBDcO,CAACO,cAAc,CAAC,CAAC;IACjD,ICf2B1K,ADevB+J,IAAI,EAAE,CCfwB,EAAE2S,WAAW;MDgB7C,EChB+CvC,IAAI,ADgB7ChQ,EChB+C,0BDgBlC,CAACM,UAAU,CAACV,IAAI,CAAC;IACtC,ECjB8D,CAAC,CAAC;EDkBlE,ICjBI;EDmBJ0P,IClBI,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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 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 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 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 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', function (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 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 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 { 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 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.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 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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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 userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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 +{"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/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","name","create","save","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","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","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 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 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 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 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', function (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 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 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 { 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 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.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 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\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\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 return messageDiv;\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 userMessage = 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 (userMessage) {\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 await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\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.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.content += sanitizedContent;\n responseElement.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 chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\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 diff --git a/dist/theme.7fcc2895.css b/dist/theme.7fcc2895.css index 4b061d8..79766ea 100644 --- a/dist/theme.7fcc2895.css +++ b/dist/theme.7fcc2895.css @@ -459,6 +459,11 @@ label { display: block; } +textarea { + padding: 0.5rem; + resize: none; +} + input, textarea { width: 100%; @@ -489,11 +494,6 @@ textarea:hover { margin-bottom: 0.5rem; } -textarea { - padding: 0.5rem; - resize: none; -} - /* Styling for lists */ ul { display: flex; @@ -541,9 +541,6 @@ ul li.hover::after { button { background-color: var(--button-secondary-bgcolor); z-index: 1; -} - -button { padding: 0.75rem 1rem; border: none; cursor: pointer; diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index 5232c6c..72a2b39 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/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"],"names":[],"mappings":"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ACE;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;;;AC1BF;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;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AClCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;ACJF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EACE;;;AAGF;AACA;EAIE;EACA;EACA;EAMA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;;;AAGF;EACE;EACA;EAGA;;;ACtCF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE","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-size: 100%;\n font-family: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\n}\n","// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{lighten(#222831, 20%)};\n --secondary-color-lighten-40: #{lighten(#222831, 40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --text-color: #333;\n --text-color-lighten-20: #{lighten(#eee, 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: #{lighten(#393e46, 60%)};\n --border-hover-color: #{lighten(#393e46, 40%)};\n --border-focus-color: #{lighten(#393e46, 30%)};\n --box-shadow-color: rgb(196 204 213 / 74.9%);\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: #{lighten(#1c2025, 20%)};\n --secondary-color-lighten-40: #{lighten(#1c2025, 40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --text-color: #fafafa;\n --text-color-lighten-20: #{lighten(#fafafa, 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: #{lighten(#4f5b66, 30%)};\n --border-hover-color: #{lighten(#4f5b66, 50%)};\n --border-focus-color: #{lighten(#4f5b66, 60%)};\n --box-shadow-color: rgb(40 48 57 / 74.9%);\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 //margin-top: 0.5em;\n //margin-bottom: 0.5em;\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.col {\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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 //content: \"\\2699\"; // Gear\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n\n //content: \"\\00D7\"; /* Unicode for ✖ */\n // content: '\\274C'; // ❌\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\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\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\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: 1px solid #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 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}\n\nbutton {\n padding: 0.75rem 1rem;\n border: none;\n\n // border-radius: var(--border-radius);\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\n\n // @extend %box-shadow;\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 //color: var(--button-primary-color);\n //background-color: var(--button-primary-bgcolor);\n}\n\n.button-primary:hover {\n //color: var(--button-primary-color);\n //background-color: var(--light-color);\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",".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 //padding: 20px;\n //border-top: 1px solid #ccc;\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 #ccc;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\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\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","#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","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n\n // NOTE: This should be the same as chat-header border-bottom\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n\n //flex: 0 0 250px; /* fixed width */\n\n //background-color: #E3F2FD;\n //border-right: 1px solid #cfcfcf;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n // TODO: Animations\n // transition: display 0.4s;\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n max-width: 0;\n display: none;\n\n //flex: 0 0 0px; /* Collapsed state with zero width */\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\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-message {\n}\n\n.notification-error {\n background: var(--error-color);\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/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"],"names":[],"mappings":"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E;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;;;AC1BF;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;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AClCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;ACJF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EACE;;;AAGF;AACA;EAIE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE","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-size: 100%;\n font-family: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\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 --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 / 74.9%);\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 --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 / 74.9%);\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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::before {\n content: '\\274C';\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\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 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: 1px solid #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 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 padding: 0.75rem 1rem;\n border: none;\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.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",".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 #ccc;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\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\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","#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","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n\n // NOTE: This should be the same as chat-header border-bottom\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 max-width: 0;\n display: none;\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\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"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js index a4b2c63..5cd7170 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 + ':' + "50064" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "50342" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/theme.7fcc2895.js.map b/dist/theme.7fcc2895.js.map index b77a675..bf2092f 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"],"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 +{"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 From 93a3a376f03c451dd750eb01d139eab3292321e2 Mon Sep 17 00:00:00 2001 From: Christian Hellsten Date: Sun, 7 Jan 2024 16:30:05 +0200 Subject: [PATCH 4/5] Store server.log --- .github/workflows/run-tests.yml | 24 +- css/reset.scss | 2 +- dist/script.d573be0b.js | 2 +- dist/theme.7fcc2895.css | 2 +- dist/theme.7fcc2895.css.map | 2 +- dist/theme.7fcc2895.js | 2 +- package-lock.json | 1175 ++----------------------------- package.json | 15 +- screenshots/chat-collapsed.png | Bin 40161 -> 56177 bytes screenshots/chat.png | Bin 42563 -> 58654 bytes screenshots/screenshot.png | Bin 10910 -> 10947 bytes screenshots/search.png | Bin 18798 -> 18830 bytes screenshots/settings.png | Bin 51571 -> 51619 bytes 13 files changed, 101 insertions(+), 1123 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 93d192a..b79bba6 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -1,6 +1,12 @@ name: Run Tests -on: [push, pull_request] +on: + push: + branches-ignore: + - main + pull_request: + branches: + - main jobs: build: @@ -12,6 +18,15 @@ jobs: steps: - uses: actions/checkout@v3 + + - name: Cache node modules + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: @@ -28,3 +43,10 @@ jobs: export GITHUB_ACTIONS=true npm run test npm run test:mobile + + - name: Upload server log + if: failure() + uses: actions/upload-artifact@v2 + with: + name: server-log + path: server.log diff --git a/css/reset.scss b/css/reset.scss index f5e9158..7de8aba 100644 --- a/css/reset.scss +++ b/css/reset.scss @@ -82,8 +82,8 @@ video { margin: 0; padding: 0; border: 0; + font: inherit; font-size: 100%; - font-family: inherit; vertical-align: baseline; } diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index de1f5db..81a6f75 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -2086,7 +2086,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 + ':' + "50342" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "51276" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/theme.7fcc2895.css b/dist/theme.7fcc2895.css index 79766ea..3a1ecad 100644 --- a/dist/theme.7fcc2895.css +++ b/dist/theme.7fcc2895.css @@ -83,8 +83,8 @@ video { margin: 0; padding: 0; border: 0; + font: inherit; font-size: 100%; - font-family: inherit; vertical-align: baseline; } diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index 72a2b39..f390a9f 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/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"],"names":[],"mappings":"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E;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;;;AC1BF;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;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AClCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;ACJF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EACE;;;AAGF;AACA;EAIE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE","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-size: 100%;\n font-family: inherit;\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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\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 --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 / 74.9%);\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 --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 / 74.9%);\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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::before {\n content: '\\274C';\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\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 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: 1px solid #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 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 padding: 0.75rem 1rem;\n border: none;\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.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",".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 #ccc;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\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\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","#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","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n\n // NOTE: This should be the same as chat-header border-bottom\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 max-width: 0;\n display: none;\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\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"]} \ 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/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"],"names":[],"mappings":"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E;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;;;AC1BF;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;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AClCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;ACJF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EACE;;;AAGF;AACA;EAIE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE","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\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n font-size: 16px; /* Standard font size for body */\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 --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 / 74.9%);\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 --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 / 74.9%);\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: 12px;\n vertical-align: middle;\n}\n\nsvg {\n width: 24px;\n height: 24px;\n vertical-align: middle;\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: 14px;\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::before {\n content: '\\274C';\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: none;\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: 1000; /* ensures modal is on top */\n overflow: scroll;\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 border-radius: var(--border-radius);\n padding: 0.5rem;\n line-height: 0.5rem;\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 display: flex;\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 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: 1px solid #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 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 padding: 0.75rem 1rem;\n border: none;\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.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",".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 #ccc;\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 textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 18px;\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\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","#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","aside {\n padding: 1rem;\n}\n\n/* Sidebar styling */\n#sidebar {\n @extend %box-shadow;\n\n // NOTE: This should be the same as chat-header border-bottom\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 max-width: 0;\n display: none;\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\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"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js index 5cd7170..c381df7 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 + ':' + "50342" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "51276" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/package-lock.json b/package-lock.json index 4c6d37b..51d2683 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,13 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "@parcel/transformer-sass": "^2.10.3", - "cssnano": "^6.0.1", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^16.6.0", - "eslint-plugin-promise": "^6.1.1", + "cssnano": "^6.0", + "eslint": "^8.56", + "eslint-config-prettier": "^9.1", + "eslint-config-standard": "^17.1", + "eslint-plugin-import": "^2.29", + "eslint-plugin-n": "^16.6", + "eslint-plugin-promise": "^6.1", "playwright": "^1.40.1", "postcss": "^8.4.32", "prettier": "^3.1.1", @@ -454,868 +453,39 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@lezer/common": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.0.tgz", - "integrity": "sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==", - "dev": true - }, - "node_modules/@lezer/lr": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.14.tgz", - "integrity": "sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==", - "dev": true, - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", - "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", - "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", - "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", - "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", - "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", - "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@mischnic/json-sourcemap": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", - "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", - "dev": true, - "dependencies": { - "@lezer/common": "^1.0.0", - "@lezer/lr": "^1.0.0", - "json5": "^2.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@parcel/cache": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.11.0.tgz", - "integrity": "sha512-RSSkGNjO00lJPyftzaC9eaNVs4jMjPSAm0VJNWQ9JSm2n4A9BzQtTFAt1vhJOzzW1UsQvvBge9DdfkB7a2gIOw==", - "dev": true, - "dependencies": { - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/utils": "2.11.0", - "lmdb": "2.8.5" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" - } - }, - "node_modules/@parcel/codeframe": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.11.0.tgz", - "integrity": "sha512-YHs9g/i5af/sd/JrWAojU9YFbKffcJ3Tx2EJaK0ME8OJsye91UaI/3lxSUYLmJG9e4WLNJtqci8V5FBMz//ZPg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.11.0.tgz", - "integrity": "sha512-Npe0S6hVaqWEwRL+HI7gtOYOaoE5bJQZTgUDhsDoppWbau51jOlRYOZTXuvRK/jxXnze4/S1sdM24xBYAQ5qkw==", - "dev": true, - "peer": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/graph": "3.1.0", - "@parcel/logger": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.9.9", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/diagnostic": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.11.0.tgz", - "integrity": "sha512-4dJmOXVL5YGGQRRsQosQbSRONBcboB71mSwaeaEgz3pPdq9QXVPLACkGe/jTXSqa3OnAHu3g5vQLpE1g5xqBqw==", - "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/events": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.11.0.tgz", - "integrity": "sha512-K6SOjOrQsz1GdNl2qKBktq7KJ3Q3yxK8WXdmQYo10wG39dr051xtMb38aqieTp4eVhL8Yaq2iJgGkdr11fuBnA==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/fs": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.11.0.tgz", - "integrity": "sha512-zWckdnnovdrgdFX4QYuQV4bbKCsh6IYCkmwaB4yp47rhw1MP0lkBINLt4yFPHBxWXOpElCfxjL+z69c9xJQRBQ==", - "dev": true, - "dependencies": { - "@parcel/rust": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/watcher": "^2.0.7", - "@parcel/workers": "2.11.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" - } - }, - "node_modules/@parcel/graph": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.1.0.tgz", - "integrity": "sha512-d1dTW5C7A52HgDtoXlyvlET1ypSlmIxSIZOJ1xp3R9L9hgo3h1u3jHNyaoTe/WPkGVe2QnFxh0h+UibVJhu9vg==", - "dev": true, - "peer": true, - "dependencies": { - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/logger": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.11.0.tgz", - "integrity": "sha512-HtMEdCq3LKnvv4T2CIskcqlf2gpBvHMm3pkeUFB/hc/7hW/hE1k6/HA2VOQvc0tBsaMpmEx7PCrfrH56usQSyA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.11.0.tgz", - "integrity": "sha512-YA60EWbXi6cLOIzcwRC2wijotPauOGQbUi0vSbu0O6/mjQ68kWCMGz0hwZjDRQcPypQVJEIvTgMymLbvumxwhg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/node-resolver-core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.2.0.tgz", - "integrity": "sha512-XJRSxCkNbGFWjfmwFdcQZ/qlzWZd35qLtvLz2va8euGL7M5OMEQOv7dsvEhl0R+CC2zcnfFzZwxk78q6ezs8AQ==", - "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/package-manager": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.11.0.tgz", - "integrity": "sha512-QzdsrUYlAwIzb8by7WJjqYnbR1MoMKWbtE1MXUeYsZbFusV8B6pOH+lwqNJKS/BFtddZMRPYFueZS2N2fwzjig==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/node-resolver-core": "3.2.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" - } - }, - "node_modules/@parcel/plugin": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.11.0.tgz", - "integrity": "sha512-9npuKBlhnPn7oeUpLJGecceg16GkXbvzbr6MNSZiHhkx3IBeITHQXlZnp2zAjUOFreNsYOfifwEF2S4KsARfBQ==", - "dev": true, - "dependencies": { - "@parcel/types": "2.11.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/profiler": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.11.0.tgz", - "integrity": "sha512-s10SS09prOdwnaAcjK8M5zO8o+zPJJW5oOqXPNdf6KH4NGD/ue7iOk2xM8QLw6ulSwxE7NDt++lyfW3AXgCZwg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "chrome-trace-event": "^1.0.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/rust": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.11.0.tgz", - "integrity": "sha512-UkLWdHOD8Md2YmJDPsqd3yIs9chhdl/ATfV/B/xdPKGmqtNouYpDCRlq+WxMt3mLoYgHEg9UwrWLTebo2rr2iQ==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": "^12.18.3 || >=14" - } - }, - "node_modules/@parcel/transformer-sass": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-sass/-/transformer-sass-2.11.0.tgz", - "integrity": "sha512-caVIj1UANPgtlZOXcsBrQ++ouAy04hcq+wTwxJrf5t3XA4pdXQmkiLs5WIIUUGBp5hwkV6/BSwc4ht87MunA0g==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "sass": "^1.38.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.11.0.tgz", - "integrity": "sha512-lN5XlfV9b1s2rli8q1LqsLtu+D4ZwNI3sKmNcL/3tohSfQcF2EgF+MaiANGo9VzXOzoWFHt4dqWjO4OcdyC5tg==", - "dev": true, - "dependencies": { - "@parcel/cache": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/workers": "2.11.0", - "utility-types": "^3.10.0" - } - }, - "node_modules/@parcel/utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.11.0.tgz", - "integrity": "sha512-AcL70cXlIyE7eQdvjQbYxegN5l+skqvlJllxTWg4YkIZe9p8Gmv74jLAeLWh5F+IGl5WRn0TSy9JhNJjIMQGwQ==", - "dev": true, - "dependencies": { - "@parcel/codeframe": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/markdown-ansi": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "chalk": "^4.1.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", - "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.3.0", - "@parcel/watcher-darwin-arm64": "2.3.0", - "@parcel/watcher-darwin-x64": "2.3.0", - "@parcel/watcher-freebsd-x64": "2.3.0", - "@parcel/watcher-linux-arm-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-musl": "2.3.0", - "@parcel/watcher-linux-x64-glibc": "2.3.0", - "@parcel/watcher-linux-x64-musl": "2.3.0", - "@parcel/watcher-win32-arm64": "2.3.0", - "@parcel/watcher-win32-ia32": "2.3.0", - "@parcel/watcher-win32-x64": "2.3.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", - "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", - "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", - "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", - "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", - "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", - "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", - "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", - "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", - "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", - "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", - "cpu": [ - "arm64" - ], + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", - "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", - "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/@parcel/workers": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.11.0.tgz", - "integrity": "sha512-wjybqdSy6Nk0N9iBGsFcp7739W2zvx0WGfVxPVShqhz46pIkPOiFF/iSn+kFu5EmMKTRWeUif42+a6rRZ7pCnQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" + "node": ">= 8" } }, "node_modules/@pkgjs/parseargs": { @@ -1349,13 +519,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true, - "peer": true - }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -1580,16 +743,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1680,6 +833,21 @@ "semver": "^7.0.0" } }, + "node_modules/builtins/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", @@ -1790,25 +958,6 @@ "node": ">= 6" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2124,18 +1273,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2215,23 +1352,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true, - "peer": true - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2620,15 +1740,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-n": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.1.tgz", @@ -2657,6 +1768,21 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", @@ -3673,15 +2799,15 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/keyv": { @@ -3736,37 +2862,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/lmdb": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", - "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.9.5", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", - "ordered-binary": "^1.4.1", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.8.5", - "@lmdb/lmdb-darwin-x64": "2.8.5", - "@lmdb/lmdb-linux-arm": "2.8.5", - "@lmdb/lmdb-linux-arm64": "2.8.5", - "@lmdb/lmdb-linux-x64": "2.8.5", - "@lmdb/lmdb-win32-x64": "2.8.5" - } - }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3904,49 +2999,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/msgpackr": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", - "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -3971,35 +3023,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", - "dev": true - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -4027,12 +3050,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -4141,12 +3158,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", - "dev": true - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5032,27 +4043,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -5085,18 +4075,12 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/set-function-length": { @@ -5767,18 +4751,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5928,21 +4900,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index e1e3377..b653cf1 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,13 @@ "build": "parcel build index.html" }, "devDependencies": { - "@parcel/transformer-sass": "^2.10.3", - "cssnano": "^6.0.1", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^16.6.0", - "eslint-plugin-promise": "^6.1.1", + "cssnano": "^6.0", + "eslint": "^8.56", + "eslint-config-prettier": "^9.1", + "eslint-config-standard": "^17.1", + "eslint-plugin-import": "^2.29", + "eslint-plugin-n": "^16.6", + "eslint-plugin-promise": "^6.1", "playwright": "^1.40.1", "postcss": "^8.4.32", "prettier": "^3.1.1", diff --git a/screenshots/chat-collapsed.png b/screenshots/chat-collapsed.png index 3aea65066a223fc4036d2cb8d2d90e3a765a0705..9b5beca2b68652b18421d705d2876ec7dc279cef 100644 GIT binary patch literal 56177 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

V5>e0T>z2{{4)Y zjmyoiS#-0m*x2WIjT|`te$ACDS1@aedU_lY5fOsUb9UfzgDO_jznjOg_b7-Pe>(h7 zc>cR+Jl@66e@ef}uVJdccAKQr)Y@}NTKie3&Vf|mKh0#_bLL}$DFgLUv3l9|z56N_ z^00EzNT`T6`njwi3iAbS%L^jI!^8JP{-?5L2Immn(z1{q6d!P`i&I|*eapHtFRWPX zZ}WHJS61M1Ulqo{kQzXeR&qn4#$KA$zp&(2vN7X-!`*ZBe}8kgO7LGD@$P^BkkIzC zudlm3Z9q3FO3EdE_BPKUu7BaQ=J1mgx>C1-C>~dXtvRee_Ac*pHDFmtYMDKLQEEM< z+<&TQ`Jaj?QDYk$>Q_$J%j>nYexB`0d|o%|SLytJpc8A#f3c~ij}URzc=!cL6 zqC4!cxgE5qjjE;D4g+>5UmI2BPx{}zE2FNy@t=aq!$Y}s>sE!#m8LNXHZ4uf%@4Sw zuh>0Db;i|m@7?>Vt?69&=4-2IX=zNZh@t1_FF3MXtmIju;a&f|461KN=r)6-B1zUinu_4g8Bz4o6<4`(NliU z-MR8{-Ae?UMv2&!@|qp5Kny+e!5?-gHP-_rW}4Y)f+Xspbv zte4c;v5M%zRA|Cfw0143Y31<`Xv@h_lH```%76jAwuz&wAaE3;4J#o>Aacm6s4zU2 zbX5O!J?wS?28(sajvXgXo)ogmMWFzop!m~~Z8~vCA=2<#$SQTl%~6BOi-*8=O|YSG z$G66N6&}W=3iA!R9I)>6eD3h;pTUGgT-q3`guz6Ue1|u^G06Yg?TkI?tFlM_;>DLO zQx~$X$nJSODETqx=IDc-QeUca=fLYdCDb*cLR2XR`Fu^&@$vEfx22q(&05}hvG3zl zw)6ZU$Ygp6HZ0{rYKfXhum9c*3{`8OB>VIGO`aEzW`H2cV(ea4c073yG7S|GaqPC1 zRgPfPJH4}Fx5l_D9&Go2^X3hY{y}EqM4UPpH3vQ0fz7Y-=^g*r#5Z(#ODYfv7E_S2zHb>g7_ZJ0@NFDj$+MVE6E_b;}LN=>gaRFI<-w zF6}qmOpdRavGI07gQG|)jpp=2;c;d{Nk5C*ZTABLuXdbaRS=7>hwbqWl98NE(!K|>5WvWR z@TA=kp8w!ZRqiO(^GI@+MRs;JMYgTX*9X zooSh`w32o_JaKQ|v{_*44-MT1h88E4WC3+pt8a9cn`$s&T<)Z$9qzA>BApB8`JYdJ zb>>Sv;5>E@cd$)w2I7$2wQI+9b=lW*N!|Bh+!mhq{e|S)oEEb`3tbhX`s|ZIdIywH z0v4u+XbB*vVp8}U%>v+_9H=KjII8cynW-@Qn$D1k4B^BJSqFZ%BqvQuXgtu)cbdke z_NT6rnS&xj2 zj20(2J?$GXpCT0!}2JCZb=|bmPrl1Rzwy?wtcnd&fbI)6yz+206fG6ZD#%5*|vG0V;sy4$! zh^;O!E4w?mRPVO(cy!Mgz`9PV3H8#_QuoM6!1=UGKa;9#t-qnhVK)_HvKzA<%u@&N z#^1fWc5ZQT=i$Q|5t)|FeE2&_GJ4bFPCYfjP{~~R9EyHHxu-81OlRl5eQUv;pzX@3 zsNC-~wa11a-%%5Gcn)7o1*P^H92moZ4^Zcg<|lq)6nwL?MDKWdmOs0s&k!dBF+S~5 z?H&9ZF6|xZB`zyo(Rk*!X|EjS29kVRrp>dHLq{@K^>eNjgJzXyb^WXgk%vP#{;P3k z{vsu@fm2cj2nGO+8kXU3S7F!7cpeZ8(!Rk!HKduJf&Id>Yu6gwt<05VIXAae=Vh^g zt%qq)ZPp08#=@;Io%+>iA{HDGaliWM!JXXPG7<4%uS9LWdch9u2E-*t9jFr*KE5>X zF#J82?bz)ZucuGh6j4W}rmn$$T(f2k_pV*X`S$~&;N|X({paF-E;T7sCV3}*GX5n_ zvC~nD&9s$OqrP@-?iP#@KSygoyj#=1Sv2`rXc)G*Lj%4yDRpa%SXo(VdvE4{bOd^W z$;zE|1Fv`si%D;h%Wa9782b?@ZTWNjg}^DJK4&m4iKXS`^7<6R!U|Y=<$2QAeyQo@ zTst|M37O#av`KVyt9jo{JL~4nUg!$`A5)_rA7~W$n+0%GNLy0+Gr9#!8lyM91z#^S zI+1h7IDEt7imF818YXmL=$jo{4mdic{U|lQF4erAvnE`Ge&k!0650M(SiG^5NfOk% zfN$k{`@<$gqhdzvpsCpz*~tf&IyXJ21@kBEwQGMm&I?e5D96?PWQ>%rw1F(oaUaZ| z?4~_EJ>s7QFIF<4&8dV6$~uc(sl=~@a7U>sRnH0;zt^)|l*WYbd!8ll!%z%XRW@3a z&3gXAg;=a<#l?R>x zCAMa9SC`??&H8PGK;_{Y?CQqCe|Bt)+v-YNhSk%S*^1}16HiP9A1MXsQ?byIV+XI- z9S#JB)wDKTL_EtZq2|j?20HsXzz6m&=Sjw(Z;W1Q26O{ukaPrXz6z(?c5z~}i4Jyd zpm{s$GZT3?VHZm^H#cM-RO&}D=8AWHmdOWi58IDD8x{MuTOqK%7BPM$ea-+HYVH=--5>}j<=GKN7Cz0QpdIq0?gEo;X`=d|c&kMX$hfz=J3$gS%q1Ld zIiQ^4XRLiIb?|XKp)xGYjs{}48{xxyrIIxHR3gP$wjHr{fAwlFX;y$-n#_&$^a>p^ z`v#ibmUEpS{^@wTc~tSYZxV*Ozgtr_Wa}L$&{zD!_(JbMt7Z6mw^diTP@4!l6gX1n z5ZqB8uw8<+uCDG^a}wK??>XK;dV?drzfe9g7GyO7`Wc&UHQXs7v90>a{!M|nZ(Bjf ziHp`9ADF?6$YFl;__2^l* z4~z2{J1!Q+_Hj5H@36PVIri18+#LDJ!pX_mnSDugtHf398SIkWIqL zDW}tg?d8jtMkspZD+*ng8(t{T*E~N)O4t~4Dtpfz_Sqb^oq3JAM?^%<cr%;jboD*BY2-?T@CWP+r`DxjObRy}bu*rLSGE zmS?*fQ%#kC`e_gan49@#OXd(FziI8;tXsQG@8se-GrU#t{uU4Tr6y1p0hNUKQ!YPQ z1z=lUnJv7ER_MGqk~Q}`DTQg|dh6GLJQd#C zbm2FJC!gC{lWHjn1tc0yQe=T@5Sx`9UEpv+@b-)~T;*bvSTQj%ooxHK7ME_|Y9GW* zVsSxOLS>Ne1f8ZXd$uNHW7R}Sb3uP0mlotSL2PlM50{5s>%J`C_wy@;Y8IomkBNzi zK&E8;`SxtpqqW(r**Q5pyu2reep(vH)e0KFV>VVxK>vzG+0oUf)z7=d4700J+d1cPf~IOuqBz(Jc};hTTC_&_~{3lR-AnvMK;mFarF5 zS62=U)cDR=-pkk56#TW<@nFO$GZH?!&!qq~dL1bx$(b@Ck2Nk4PqIm=>N30n!u`qq3nti~y^?^G za+fdf%gfJ)&dxv-A>Jj3K_GVv6mJC(#Pk;a5an@@C9)gcn&?{xX~w-H{sEa2ij3S2 z6**dM-#gc3r*WRv0+-tioRV8mwkn_-*NV>|HX{QLTXBD@CuWd>SeO~{=RD?Q1gbwa zHs&4|w;L402c6$vloOzu?8gO*e{v~pCqF&jyXDZuwa(7YW!<4r>&bEpK&P3cr8-~_ zg&2_(kHA2<5tH@ON+1>Qkc}Y`$KEr~%kbWDV4!GAk7>YWo1-TQ){58ntx(iRhC7TqOjhj4G~ALQZlj&7Xg;qElgQJoi@<3MXaR}TobNMU+!6v;0k;-Bze=x z{@S_1)kSH-9cjD%nlMj*JrFb#>_)pAHxw}$*4Eb1T1n&`m>~Hx*Xw`qp7m;L@&#Wc z1E?X%VO;KZntFEVKEn^B3-Vesk&?K3|GscrRDxZdueZ0~;_s0W8?6GREA2Z4$aE69 zUrFddRtSO&bisJ?!8E-<59+m-3!vzu;fQ_l;@#y&9V-_!C}9}LhEfyGv9z! z>3c?cd2?lQ++`~({<@S?WCcclW~C^UG0=jR37eT!5==h@BJxD>cTQVgnNsxRA+!&0Gra zi6C5ET}dkOoV>FiRZRcisFfDJ?loZnT`#FL2%pP{GE(?mt05o!lGyJM$bp zTT={oqBipj@-}GqJFm(s?sjT z0wEW{KNeQb^&ubWl{t9^*2BuuHadTnN?}7oM@)fdEua+%xDKC^QespW?SL+hh zr)rPoqgs+L_^-azc(tBm`}T6F!``BO=m0DOiRy85IX6b`0n)KtJ}wz^<1=jLvLAYA zdfZv_1!EOi*oP1$i_w%G1_$q&iMv=;=^H=13OF}beXx*hh}bD?o=!O(1uolgV)-@7Or!_1#@3wEq0h`!^E0=Ii+V?+ z{!Bv4=Dm37(hJu;Opt(=}Gn-oI1q_qxU=~t+6HrTf0SSjR^R3H;F zaK+^^#SH3hq{Vsgw>@HPS|)7ta$z6_hf@z;>d^_-6pQmuegEp6qf!IH*2!Nl!eOmx zr7P167s)_uXbsG=)C-h5Qp6=B{0GLr=iVeY4LU}oh=R8nqKNyCggjA>)5*EU`+!4? z5|ZBI(E)}LbJRfCgbgS#$=s24oa<`l1H6akpkqvPW+BEJiydk*kF=jy`sGGS;9C>= z9X+A4^~XYE4!y!e!}MXzZDam3=;f|wAeYUzCZ33fEH&3!xU$<-i!TH)tM+D%*X>aZ z%jIN^wJ+s=a5Pz8HF*G$1#Qy^aOwjDVaOI}`1}S@Dvq2Dnn9A5zt}I+IaJlW5FemM zNo(Au*Zi?<8gx~d?+Lp*WE)SwI%ns+TQQps^pYhS17^3pa2?w_217Tm=uv&aRKS*- z)Z|fT>e%%7E_2;DdGe$#o1#aE%cNh2ZwSEImSG);x8F!PUu*S%_d~P=bcf%=(v4)o%XxW~ z)S8hQh87bNDy1K(L@#p_eEHRYRk0{OeQ9(&ri!|iOFe0Qko}D|XU?AFEy~=EL zjn%84F<|V5R9xjpQvZAay(N z%m6O_VPisC7%}-2-tW zOI7@b52vX`KHv6VJ10LckL2dY=uRe#en)J+azoDpkC%s_2Y)#b98>eP<~pD;6hzWH zB(bZuwl-jnf2)e=z^kH&EVlr>+D65iKTp+L68RLlu+@sSS z5rEX!*NM1!OZ|ExaQ=luJ0zOqr}Yh$T_xEG{)w{=J~J9?gMWTM-8mIHxsATnzV=dS zj<7}38nE6{DAreJhR>&_n8mC!gG6X=Z*OE}m2|kxG@%B_kC9YjH|;$gjUY1V?P6Zz z)8-G_SD(|LZ49TXTw7e0=UJusMu!<>ZGM5{OP)4UljSgHLnyQcH1=Wm6%sf9c)>)^ zxi(00(h?NDmje{4@qK4KVyvQhYxW=Z?~Py!b*L4-K@x+2d%KCd9Wq^{P8T0i@+$&h z9r<4ci2bmN)5E`o_oC#43K~;(baar)02#hd&`ISfSoobp8MtR)c=%1)<3D7^lFh0| z7AsJGXovi*O_8(3@)}PM=nEo0i6YnwaQ>?$`Pp1%BFLAxl>jN~4e>n6(p^OBVEm&2 zp`K~`_5g&3f8`fPNje?^PxFN@T>|?XE4$(z3;zV8uE}fYDlG8lq5H{UJbSvk-P_u9 zQqSL!a+DaRbq570X=!0a&qs8bqVD-Ie~4uMA}ni4%pJ0l{nZZdMQdzqY$S~=skv?{ z(gi~n1(D!9owT%S=-MV!YV@y(U6ok7w-wtVftxL&+_(=CfGlko0$uLOrLU8L7xB{_o z=T9I#4nQ=9Tul$uvbOx&qA%5XAtxge9*8ww3PjTU`kW^eVD#0!1;U#sWh(0GOZckZ zmvJDuOIB=@fchI)(5KiEX+xffXZ?J( zXH8$z=g-rfR;=aA5q9hQwlm3Vzsrs;Ol@HMkQ)9@E?LTWYL4 z5^7#FQH=shjz!%7$vFP%bfg_hj%VvTylzNflgMbhch})jmnGnWXiYvw8XNz6K>4n7 zJ+$}PMd%PQf%AHhjB(?WD*WN9!C-XI*{X!s&`Tn<`AdgS82li98iFDROXQ<}2HG41Gt0`~m`+ z=_ortT$N86^kOn%qTyg#D-tA3#pLKR({4_Qnq>yw~UrZd@UC+YO!}#G+p%4z8f{ zor6Ou)Ckg^f_HE=m+YV5Ld@H@??0k%h2$R=Y3l9SE1<;pGBWQ+Mp5tR+gjUyOX2*J z&0jEh*vWo48g}&P(P&W9-hHw0l9yTg7KRa`C;2H%dPy8A1lBGvBEuBV&DSV+{^>IPh9MrP;9EMvq~ceXIZW7vRQJ019@@=u9y+jP*MU1 zIz;-2;lhOrsXI+$21_x0YoM`^><4FL1aCRx1E>MNA#nc49W9UtyS5wamMtqQBPj)n zzY-`e^k|PjsRc4+RE{Qv9EYXdaVdGUN0O_82NywEGp~y%1~gICy|FYmzD4quAfMKo zyC4F9s&}{V&$4W$gDSs8+Eo%KCC-AqlX4C|7&}BSCM)?ApjIkEAwUhsB{@kN)y2Ba z>9dXUbAG;()Ol>ia^}VLoRVvy&7v@~?h8QsEFll^K%1ZX^L-oXNq`!Y7lgV-MPM&_ z;e|YqGU1PX1l}n-OXIEk5Ze?XlWsI;T~GC2Jolfxwz`-HZf6V{Odk62_sU?9rPpgZr;Q^D>Ba4*1{e4#dzXKQ4xbQMrzm+nq~)0Sn+ zg*H6asKn(LyJkpY;GU=0&)@?URnJTMw>u1q`>K#pLD+^{(SRyIHA(9Vmcb5T;ms)2 z@>ru2`!#@y=N1-BaQhII=K3C=AsaPB2P(+FJ{cL;AAYZA#PLp47`A#3jEoU*uJ}On z^fvy@bmV6Pi6Jx?c{HVg?KzWP<3})R^u}_u=}GDV1lApC8HGa{-dw{s{%VNvEbfmY zMH|3v@>~q8-)I~_nHzOmeU_5hg+K$TwvLB>hc5)z$%~vsZ_jKMUc*`FTBO-TW>J2{ z2HK$v!I~hgF86iyRE}Yfm8R!$@uc30BTh8f6IHDNcX-V%b(%InK%$JA#K!Q2xJf1$ zu+XA$ZfTz8%H~k}QS++l?`;K}m|3z+=m|PczT*lCKlwwwSl+?weoAL7uGJ-cgY59TZklU&a^=>MQa*B+r>)eo7%wxp%PNf-7LMKNnb*^!~|- zU);s~z@tGdBk^0y(+7DZjRWMd_-?&!K7*v63&)%EQr=4Lb+#2Se5QQVkgOsQIZRfT z=5;cyw+4NCxr{7G>$lX50%4@O7RmS~wxy6&ivag*7E`#)&RL&TSi__mz30qxfwxvD zM<$FhC4UMVj#oAWWa}nZpqIkrrl6(ub?&0yKnDojGCu|r&ks!)fk|or*8~VMq+XA8 zmHNpPiiDs;zY2!Q&^cEUrZch!t=+blE*nmdq@`MfcRAj^ZHh8rXK&y1dV7qm#BN8| zc32od3N+CYT)M5DVNKX2<$rp%0#{GR6w=Zj9~uPyW&soxX<#t!qY*&T zfsCzP?Zl#v0fiv-0>dfpto!XqC1|OdqAa+4+?9f%HGx2j18O4iXQCdQk(ytF%jJ9j zzASiBe=-*^nY=P`8I_w}v9(PRS$HE9uNO5LZ(eqn`Gf1Sxa-QixiC6tk>l=BCutao zD#$yZdU}8*SAJn4fG2E!{T%vt7+g6H|9o_ zeXZhJqJMPaF(as& z_l8EA;^++uoc-XV-*bEiV@UU>qHO(P58iq~08)3TjU+>~K%bG5ks*wFCuKlyA1hIZ z*E^8e1kgn&enAf(dccsdw5bjzrBlHHCsINrOCp`tIH*8{Xl6$M)`g5Hu@N`JE_kC;jBcxo%UdZE)8Vg25yEzBeD2oxaJ<-?%z0Iq?NQ#0YEVPx{P{r_!2>lbP`AR5g?jLk znFYYqQXF!WJP23G3mxwTRtH&A()-;2!=RvPS{KIcfJ8*9>WEqS;&q{UdM6_cEi>5p zLaK~v3!n{?svzlc!a7v#*ft3>BU}aAVXS&0ye+zXPSyB`sCdBbV%*mRV~Kh&np{}; zN7B8)J1s=c`-HWc>(f2bzQ%iR$WpdCkqlb!h5Sx#SC6RK|7uETw_$MEv|*RnMY@># z5LEA-bV*xR4T&J%?AqDy^@*B%l8zI{M{gK)i`ISmC2((uQ|xiVuUs9;gz zwa$e5)0YY5%QtL?KSc}TBP3r}V_=Li?qeUe zROjYAkd>`>3{m#R=wlSarry`IfB$DLxEU!n zh+gRsv|8>LSUoav3MJijaYPhB{e;Sv^Bg)ezqQ-)PHKLI!sVH5Uo5Yu#^>)k z<~XqiNfT5IzoYwc%;4~)8h5<|2OHB_;>aTwSf>YZ_3IYuNbn0~_iML38Z)F=r-!cw z5tjtnr^z}v2RD?IJg}pUU=fN}Q`W8`X<6MTHon@PJNfSQ>)G)|TM7kc+V^jc@4v5k zzj7&*u2=F!Zv@p(FO53+(+Y8OyI)&DxEbz=|#uOczx)K3i@iOw3`$HX+_P=As|dozK(C56wb=W=KheA z^WL^giY#J)YZ#$Go7LU>pY;|drGIU1>O_#&Y@+Ye67oQSBOkn&e#%A`76l_CZqx?yDJ^?iw}a*rZY%SzCfupV>Lf-b zpP0HexvnnXyi^lfjJ@GFl$`Z^s^_koM{kQ8{DXqIUivq0lnb|}y_<6@48V!+x;}gC zc|cgQSK;v)^%rdO$p;rqxZr!>dPf5rRhicxo8=&nG9_|Nx_Q4<)z7-3@0Y33VXuvR zJ<`T!5a_y>VTjNfeh5rUb4YDDxE~eaV@t~uP@Is<5_nLJ@^FF<_ z*G~Oz##x26u@o|}*TRq3RDsEa)FWAa3W*1ZDSS7GhK6yLpNp>=AB$g-U)=9Mzi0@( zZBuMlNMFYwXJ75HJT52}6HWvbNp1W4u zPi)$Eq5RWlB}Y!qRx#J`Z>=v5Xg7^4ZTmI}Q~Uju@8Xy0pR2+dIW^rzu7TC?kB8RG zL3ab*i$aF1F-D#?UL{P9d?p977G!)aNHqOpb@i#RuDzn7PrJK~$fkz{2J71dHPGqX z%=ox5VA}B441Yv2$PWNRuZA*vKEsj)rd%`xG691;9b2hFWTb#^+!2q%ugxK6cI4jN zFyW+#oW-eilt>yqe`?^ASn0648EU?g(nqRLE3yNibEPQF zwzi{kgHm?g1Wb&NwY34T?lv+p$(%mDo*XIm`a&pg?#pcM8-b@j-6D4LPlSOOJb{h$tODeCGjJRYI#@6#chYLb^xJzgdKfOG z_{$-AiwOvwd^S_QjT<(7)x5CQDg{uMPTD0#yeJkl7h1SX;wz${pg;f}&mE6P>c-tc zOeupMb=AQk77qyU_R)=xiz6T3V)hKWlNmz6xK4g#o?@)R_3A<& zeOYI!l95FqXk~=dBktaZoK(>2r%$zGCbDs4gv{$TKya}?SRbBDFJ^yqlC@2Ww*%(k}NKJd{!Cu&7xH+7w^a~6mS8PfFbQd{` zBz!bbt-HbbPxW7}(;oi$2b>63n~Gv-=BUy7_|BiM!a(TiX!TX*$lj5PFgfZrso9Px zWTs8q)?Zf(Y6YTDy?DZcw$$MpbpeTLF?Tk0zfVm)yRvL(bDNQx2%uItdsds*q@7Ra zNOQ~d9Yp-eVa0O5h9^_yiqf}SF2$~%;pUlI1LFg%a{^rGe4x4)}avbtRTf&QT&3yWR+-jV-2``YXL zKU=HmHAY^?Smk_OJf&fAxb+F!RN?CKhUf+n*|lenY!~OK^HG&uP2^4Yx)s6cNZ^3W zA=jl_@OJRD57L?%CN92LFQ z)~bHA`xKcS3?6wEAHR{Ey$b28!SA`E&<8K#h4;4z-GOM_=`yR|={%`Q28K|HXdFH6 zBlt1iT}*|76o8l-xi-Kd2=pLNlo@&3f%3eM4h6viWdRyBY#s2{t! zq99rw!m%BkOD{np1lUsT$vPbBMj#ibsi9jdApd{<{YAfx9HhWKK0O@=E$IGsi6AE z?1&9JXT=1Q*i5(fnyE3xHrkc6qEQq!&q}CQ-beTK|Jx zOvA2KtZjVU?pw+Hqmbo#0Z6&f{9z0Gzyu_pAhxaJ?bkeLNQIqF0DpLGL}Vmcp74o4 zuAdPlLAyrc?H(OXadyM8YO^cRsCh3MFV7*6g7d+bAax-mmWGotkc$%p4nyjg z`SaZ$>jNZW380M(LIo(su3`T&L)^c2uQ#LB;BfYR-rb3td_t{kKi!^FhLHw27r+3e z!c#F8fm@}Ms{k^jdXiGGzy|^u4^JO0DHL}<(RAuyOylJ#&dNdv5W?(?aM-KNAq`N$ zgqKXXJbP{63TnXR3|$udDSFhs^K4M{uC1wk$h1%c`5>npjR;&{TLiP3EvV%h#58y*|hNGfW@9EDJk#WMCRXITJ4{Bd-S@Zs(y3GGNdO5 zL_UzwFuQglGyC>2kwHy|?}tO!;=i7gZ@nfm`?SC5l4X=n-b59D5L?-1xnLXG4Zf3u zy=K4- zfO&Dk@)#NRLAcl*orjVVWFnL1| zC808W*YYyIO^pfQt2((!N*&8>$Z_Dhre1(CY*FPHKi2G#?t{=^&t)T`lm_PK%VU1aym zxt6%m8UiUlj1?T+x{GrnEV>4&oihN_Xb*NnE&E?LL?`c-5L$tg{8i68cVLfduiUtLwdW(3o2HWkVjcW)OjBCST*75iY@#-ULwjs2t7g$GVG=1-%aub8x>K)JIkUogz5I!7)F}dHJcs#0M(+q;KM> zW%@Crt5!C)s4HSud%fN}ueh!MAi)iZMBupcaN z+6K?z#Ql(h4S8aP4Az2lGeFMN?3benHpuRyK37^=N-kF1y>A|8DvlDM!1E7u=t(8D z7iI&?MDi-@+aS+@-E;0vFLh#eE5EYTvz$L+RV0i#y<+8LY5BT%YO{z<|4djEW)*&v zKyy|!{f_6S!@|xpaQ!a-S?#6{Q;4&_Pi;k7s_-3C+{nY$1OWZRc*FqEEtwrd?5PJU zlt5VW`!6S?28pTBF2nhnl9GQ|?)L4qklurz^&`kkepcmBss@-Q$_93zMoW@mVS)V* zZLDpAwAE=gaNhU#_cu6rEHcV%<)7-&(^CvwtFr!QW8?Q-IArlKH1q`Q+Jkvxl%T5W zO?}wz{JmrI32-E}BHh-xVO@r)Rv@_w{IP zIOuv`4fC|6Y<1p}5QDD0x$RFT--+{Apo1NEx`9kM-}H)}R9UX~&m~h{Sv9m!hY3Ou z^R;?Nik~5lFSwmxT|GNsn6Z^61DmD_KOT%4Dp#HQE2EQ~QcwjT+Fy=7UNk~I z*xt+`PBWWGzgS?GC+hK<=y~pe(t71M%;{RzLjv6LmkZYv zAL`_(>a5gxwWegD${m8#FL%%~W(>1SosZ@L%E=~lY9ieL6Y?f6Pke(I$$aTsw&Zb? z0gRN(=(Ggs{=Jr(EVcJ+9+ z|5eQq1<>KsMk^esPZ4X*LE9BmnlFiIj*OC$7sHJYS@NsTC+MC|wl^K#)pWgRkg{V^ zsJYf-eUm9meeLK8@@5qRfR)!Vy`tW_^kbNWsYiz+6!Mjk?aDT<^jllx<5S@m-Q3Zq ztjCe3Dc7s``1;jZomu53+pCx9R9lgPj$@}~WT;(IBRMWu+oVNP_hcWF7g;)IuU`TI zm(QCM_v^biQFe7BUDNA+jx*JMUvk%O?uYxoU0UW`)@>eDJ=MTVp3j-W7g_f`JyscZ zrt9hIdP%J7{8>40@7-JNGdd6p@Qi}k*z(;@Lgo`X4+JtH6C+aQpI5T|3kFs=V9V4}XZc#fKA+^9X6b(*Q^KBx{-{_>Hs4rx<`Ra1GE6{IFn ztaBam^A8h%VCY_5P=mNT`AN4sd(#@DjpE~eGB=FuIu>v!oG*#{k)Wih;U52$uOo$SulTiN&lXzt#2wUkK0b3pggzF5WVl~v$%au3JI`R zYkfg+vDog^y3d4c_3G7&Y|!JwW}GDB3sYQ_R!_i8T4{p>2ZFtaW_S;T7bs?e3`c)p zWH8F1Pl18GL&N$H?&qIhO-kY>!k@RFwHg%mIw~z_NJ#FM$kmDA1KOYGnsj$q`1)yp z$C=dR(t7#jt0z2ptup0gmvgc8(eIVy#^^YyQ2A5guaZzzq)A*{4mhCVSnXA6(c_tN zkBmJRrx*S=fa~ZPIoce$XuaOuszui+$=Q;olk2zF;!d>Ce80+gZhF;96d0{Kxr_)hKD zp?VlVP*1fo4(iqP{7Kg?)H+{UT7dp%!RP6T!{*ua1gS%>+Q->d{mnF8G&QR+24XZC zot>!AYIbQ}>F3D3G_1N+iA0W}BaRy9r(#qsyhsI|*r_Lis>#5g=8Q29T(_GnVTeyE z@m)wKKCm)@=5-HBtJzWykDoS8*KUYP>kqQ3>=ZaH0euEnjSN*(R2=p6YV;htR>>P_ zlNjx4x;Ex6L4E2?G!dA>wrx{^kJlkN%n1F+^p`ouRr*-c_bGBK;FKaCa*6#W5na76 z?(x#?Ro8>N7XMI|v~|I+n1pU|z6OGF5!apR8E_a)IO9jG4Wgv-L6Pz7Sx zr%r7V!;bsk@=uq#FoE@?sTi!4GTiT0x;~-nmQ%y#D6dIl9=w=@Z| zsO~I?@r|s!{p+PGOH4x?7XERt|EQDLQm`$iG)|vk@-Tbumjvpjvb4ja)6q?()g2o< zdGbkiFy-y`ojW%}Uly1d%O&l|iJF3#$JX&_hL;X5Dbk7sP0mmVp5x-fx{>QbR;aUj z`Hf7-w~f~a{`%`3^6kxCbt5S#MAJrJCDNqs)eVc&%=S5^&#MeRJ$L;0C3SVM2ynna z+p>#s(>hkQ7@XESI~c^91`wir!cqN+je)T@vTEi%m=E< zvsjjmf7liE{jC^M)X)>^cCr?hzzl!BY%icX7L0bp3NR`>z$6^K@;bM+>w5Zvx*@L@r6siH|$cs{DffwSjCdnZ!$8DMn*<1urpN( zr6eQw%h{c=Er|B654`xTE3)dK9FmXI;Dld3|Gf}4g7?nF5zJLVa&tD>jWdyWp0EGY zxQorHJ`d;%d`;xb#sgA|*G~>E`1odRsboa{@^|Mk5yPquvPHzcE}W?G}! z;k@Q2E)vzY3BrCHf)eAw$x5>$n1a(LY=3*F8#SxYPdfoYina|% z?!49wQ2q0x4URz`6lkO9#LA&`%;&Ma#0pa+V*6jb5B8FjJD2rlF9jls(jP#X9zoe8 zL?>3hJWVB%$cWd~&CQacJH7LpJZ;HOzJb^V0+@ucoQbF1Wd~lD(m$VC;JrE!pfvzU z3zAJH%^@s?X=ZLsl0Zd(lMlDvuKvUI4IeGojl&E#MRxic#{an&aaJaiotHPahm>}Y zOG!zYHe<{kK3QBO7H$eNKl-JPzL=KgcI4o@fJ^_{Fz*kIa%X1gkBsf}E9-cnCIFM- zq6~a2nT>KA;Zz}-C0i(@@={)KOZ62;CoXrJT0wy>;8v9JJgVh1+@cX`_?c%);&Ao~_)R#=!%j#b8)i#rQ`1vIkC+q^ZH0VHG@gSv5388?i> z0?t{Y*OyVBKh@f-`1b35*#;_!=gfS@EIbIE#ZZt25)(H9n83-CJKOzii~LtGSlnO4 zJW$GX_n(YfH`>@_k<9-hc(O=DxJRV<;nUczolk0B>Rc%@?KG!xUWgGPWWtTiwocE` zX#RPW>xCO9;|{IRshCHuH|qR^D1n_TaGQgf*?x*YTU%R;Ft{gxe+33HC=5_@Q$@=z zs*a2kc5DSdSV3Z*;)_-%^61e)kUybqOlx8zTuSZvAb+^ctq#f8@yR*)Wp;O);NWD^l|DiyVVNI! zCc0tmbADqhA2O4{nqc1Dz56Hl_HRRmMBZ2nS980AgMNlTJ5ih`LB#y&#+vh~pK?PE znT~MA!EiP87ZZ33CLE`WdM}&N_(K2o53AO!flM-r;+9dFNiR3M$j*RQrkyz_CY?3w zyoTq8Cy??E&eWh)7pfoPvU9h2CV?|rPM3sh4`XCdykOzIe7RWFiy`4@$_CAjUF75G ztQ(;$&6vgwTrUk!2%s3Js%)xwo8PzZ&Rx5VDxTuTz4mJLJ_V}RvB2CANj!ss2&MKy zM8B)9bll9DtA3dWCjV;Fn#B{mXC)O4+(@!oecM$9G0|nyw4wFYjVytcTQ0emsF4m& zFm7Quu!*S+6Vvo3=3(oG7M!>X{V2Un>L=Rdchz=G0}Qt@nXti1_qF!yECE=S!l&UHi9Vd z>XmU__}CdUj8@-J0)<8-63Nj5caKC1vp2oV8mF_KW@VLw=^%yAs+xNL_3O3bdu%s# z?jy^uCv5L{*UrdgBSh}T6H!(->>DbyFUQ6j^xsa=^EY)I?>EL+EuBaW$<{`xM8rlI z*TP$P+|XXOC;eR&mSj0i=9#;QGGX16B7Ud=o3zB;UpCN<67nbN+O4v8ih0BY|7mu% z;SXh2SwV9Gfa>efi%DO$dsOXV`HfWxRR!jQ!H2(31A{VxPsZ|qNr;h;fnLk|cke{z zCkY$wH9NIHCnvza+3*C6#~l>@1MHSW%xt=QPMlF_d)UjAds@uZl8k;$TT-P<%Ld~P%Gisd%_~# zTTdO=Q>i~+I2jgZesPA);7vT=sdw~6chJA{L$gKgxsi)MpGsBoE8a!(vMk%_(jO8b z6&3nfJCA<*eUO&cvkgs$f4AEbcF`dsG!%7J7P)2nu3a9XcjxL?98i(3jjY ziJtk)sCg&KZFJC+L@n(fdsoz~` zH&|XiX28#bG>so?wVjt*vU;n_2^|-^Mw#p*-rn9X9ekR5->ug>n^Vyo|3}?XJqyi{ zxaxB$MIm1GtF=uBl`mPN{K4q^v)k)U5|ng0oWye*)8}ka^G_K-JXY##BfBJHs0Jk^ipSp$CNWJo#q6IEMf*2ER zdhqwo;>l}o&I4>ZH^XiuZ4QK(MZdwHDD@co)Z&a8MJO!e=*qK$xsLsor)+v&5mzK$ zC;#*A%h{28{`=PjUh4-)4EpciFZDSqap8Zy-Td5-5(obKciH-kXZSjPhN0%+Oi-1f99jRswLhsToc4(QNjX(A5%nQ7FBI^=qck}OE*85ZO_ z8F~_8gwHGYAa!U{j799Lo{vH1ZtIYYbRq#lu~0w$9&0q5a&#l`FRsC<`ZwhN^Jc!7 zt!tXOlZtvF$OTLXbo|~zcu?0ynmc>uOt(FTF>b>TZPFEKJ0s%~V~-3A3L1K;X$U3} z>ohJpRi|Ucd=B#31*X!oTVC5UZ20fX{jz0_kHk86kg>6KsSPJfEl9;vQ%sqZ&?LI- zU((!_2)*Jk{)5mUi2yoRs zBoY%6gxla*Dg~ctri{n38QFV5;cyt{yj44lRDHZx|EZ&YVKRwD& zMdEF3Z8jrIOn-vz+Q72d%ls@iQfDk?x=#UlIlO6r1kZRg>Ii%~4pV^5w@YJ|fgZ*Q z>4BI`GC4rj`+^S)UmmErbZJlG&e%zlP6!|oW{yDjE_YGXZX*c6^cNr(NTUS} zu&xu~iGuAujV*4=7f4pj#jifGRJtC^B5DwG9-$?IdM%oqHP^RtVA)<0*$Y(cz#Z{7 z(n#o%#`JRo7*Jz74)Adg<8-iRVX}wMH$Cwt$oS~sgv8i<4KT+T#xA=`ogQzo(<)H_ zVDkj#rzsJ{MTR$FQ0f=IY8K&#I|5z7+^3;%jh%w+>zM$3R@>hEHyCvNaY|VNaM+sS zb?LHY4{$fx6B#L+R_DOb0sLhg9x@ULo$$7ThAFHgU?yC8-i!f*pQ@uA;JRQcFap9% z_7RE+VK<+h-A~wzpx>kI7z+bv!^KaW!*dKwfCzZpkj{6Kc55ww6+@U|uDK6+qyT5{ zm=k;~OWlC)l)I(e}P#~k6V==sM9bq4doGItyx zCOwU(mzVyQH4rNV(nqph@Hn=(h$;TsXel0&7Ks;nx8JDstg{Dc4rTRg6c^w&<;%9nhcoX{?fa* zIIm0??*kruUQm3SNhU;Nu?(4evp0uGFfv*KrdGE~ z-GO)#0>26Btt8+StRTuZ4>gHZJ_wGrki5?_Hel98uY+Z;G>pxfK`@Au&pDtbwJ ztNeJgV6hL{hWz*01r0ux^s~tH8Z?YN+x0|N=4OGkH-A@G|1WwXer&M9_%}$f>Mp>+2+I zDeNME&id7t9=&Xj>QvB&&F7R%W71#2J#XeUpP#ksB>FeGnnuiScI|4>)!2B~M$!ST zvjkI-dAyizyFVor;Wf9J*QZ`IOB@0Ps&UP#KvRQ%3ApLh@CReVvbyxH=}uc8@%#D- zJ61h(UJ|gY_HjW7Z`(0l%c!gnm4SpX1JBG{#)S7Ar~vKUL)Gd33D1WkvNraWFa~?Z ztc7_)4%%_8fTFRrA+w@={oY@yeAeFFImmOqClh z30alp7ZKAj1ZjH?|1azMcLK#A4A#Lpa;TdkP2uItC0bZ<_g6?a5YM&@E;(i%pY{;CyIu))$Y>c^^}P=uG=s#0$)TdB#cHv$J%UcLwODm0I4OJ!wG6kUx^vc1e)_O;=V|6~z%%2Q8 zco=ONqlPHmupuTg3dpAGQ)j9!=4uKGXW*i|FDqLFSzy`7WB+q!wO6ydEj9hj$z%sW zd*SB@S_qF~;{t;%9 zQ7xVW^(+5viyI|`qSY&8-5`a2_oGPR_rSS=?+Dq!tpc{uS{mAN^o(yyU@bP1x zm65*2e7iIR9tk=jL3zwrv&XSMUJnOEW&(b&?1@Vt;)y#y8AF2;6b6>bgGY}59W|-@ zfFGw19sVL~Ok~?!C%dV(%;w9Q4zja?avS|>wi|tRf&5;P9jHaZ0GoPGEiBIYploIO z={?f&R#UGyv-3(riw*Cl$Kuo3(4c2J$P+(cG={|41Fmz%_Kveas0ZQz_YL@r9#0z| z?eDWc2`w!xe$gT9n+GgC@trBflYR77p}Lb3C>+HQ)%f~W4RRMN_I`HuN$AH4SiAgg z({^@++C_>LeBH%@LS7(>E4<*wp>9%e8u{Nm(AhTwV10Cp#;E-hfZod}-8mRDZPCKj zPlp)>czZuo%$Xe`^;*7Htf7{zZS7b$t*xMEyupXBmRN@7ie~#P#|6d4+MFqTmX$Sb z&YVC1?qP1yPYLdj*eBOtXJ$mO-zxwpkkos4E`m$x>x2-*9 z*p=vZcCM>XiZ=A_C%wQcJVNci-O}L%`T8n_OQ*UXP={Y!kz;$!w#4&jVd08zSN6;5 z1+~j>`_El{2`&gX(85mZK-hsEfwPi4@(zt%t#=BY>iFecS?}F|#}5JPsW? zG*DXFaz`L-mDn{bj5E!W{0Cw9>Zzogz)U^+_GML+R82z>vh~gFKq`@_(%Q3{D^`D= z`E2)mtBm^|N20#1%~zd#+(p-14UZ*+zT}6uzuoxKWxnL(@Ch%9_APN7ku`;yjRM3T zcc+4yK@;DEjUg$#efxHUou2jxm!Vj0?IFK;@1E78ZtSSA@lJ1=u9Y@;7dlNm=^51a z*vUk{*l_mK_K8btjSl>J$zgWA#9INUI68`gxvqg+GZ-Ht)_+7xt1$mX03kMv1l~^@ zC{Rv)o7zoSw!r26ab8RTqm27h(b{nhq|5h}mEz3cKJM`aRx0>W(sMcox3#w7VQp}9 zN&IqHwA4{x?;+1PCgLh2yWdB=IjfnIo&{#D;?jJ%)Z$d)aTr;%+kFRJ&Y@t%x%!mQ zYS25tZNCR=p--F(H;$S?yK@G!g~#WAcZ1LOmY4$^c)x51pGh$~Jl1f{J2y3Lb2WVa zky2BtXvLoJczxVNZ)6hX(EIXo^PR~E9>$R$ZL(Y2zI zZ@k{Gp=W$Z>j*X1b4*zWju;W^9N1o-a&7CYYe&#WZ)bx2dwk6Glah^*+3^!VzhU8d z?VidWa?6a3SDmJsh)bczV>xM!_4?&R>emjdk0%pr@oHwHD=L=E6(|| zFuUqDngW0)FCPp)et<9p!YlEjYtZS_7jBfE-LQWBU13k^ZSXXqisD!Bl_0Mx@;$n< zZZC;~MnP4TN9jM_P1Zb{@Y4<1eaTt1K^ON12agh%=BHv`3Y4pW1>(Lb_>Ce@fRhan zw5`sQ$Bw;+Ti9o)Qcrk=60q<_xeTpuqtNnG*eLwm%P112-FnSOi@^@GX*@NqE^2c% ze&%YK^yO6X+0^h=#>W2bYN%&;F2eR6l1z7}`J?xAwWW7$Wc46?F|})L?=phQXMqP} zlim-CV(K9yv!8DGGu-+ggfVYHvD^p8YhYKzV3WGrA2iNQGw&r_>hIpY_@rj=jgxbt z8`_js7XQ@yiv8?Hb+>$38{rl^{f!*(*y?Abw1a(68SvN7F zJN4~(rd3|()3a*(2Y>}Dx82#WMVh;164-h8RPEE1XU9KW9e=af&EMNwNpi*rmf%=8 z#4Lz^nrv}aDKx4~hCqFPl3-6pwRaR4nQg})PYn8kaLdtMdPKIDa%IPx(nrJeJa1WV zEfM3nz7oI;w70t}19$atzX6Xm;@csd2)<3|>ZJ0gf4<0`-Mnwx;f*wNR;Q&YZw@byo#W82zhoJ}3D;IPM`B_ky+^9BJ4z>gF&EMU{k zg1+#t(u4B$Li;^;t`8xXah22sIKo%l+IE6NvE$8Y2zcX%@I4UhX2eV}E!z?VRSoY% zsy6e_H_?KKDH60%Xv9YGl_yVMafOmR&Mnn$QjZqGV>hPTw8P&fTTBeZqJ*jy$ z>bKwSLIFnAu`hLA6*aWi`sbWtLJMj#<&#VEM`4ih;PK-ZY;7@%qCQ<#(Mszh6b#I7 zg#{`zOuiIyBa^!W_Z-7q!y?$thslQ`w)NxeV0rF=uD!z)F2VykeeW@&An2_}{xcgr zoqEGAW-~(D2j@RPTT4_j>L>0!dnPafN`admU1~zw#2U@mHfuYLfZ!lP*R(tCOwd^x81@XHJqm+Nz;yT^u$Tfm5sElJ{P+@FF%}^` zg|itEu=qpyz%}M_A8({)<5^pqDVL~;X=Or&uix6vxpY(SQxFQgM4ZTZd3gZGg=$0qcDf96G^MX83-J zvR*)ocO~wgm2D6#2!U9@^@S2DM%Ntj{20dM`faW6u76oPCvI>4wK(QG7~LzLL!TFl8SoQyZ1rGGKM+lV`v>m zb!;gD1TCB{S2%k7Op9Q%e+)ZlJ=i{X*&SJ-7^SrSX0+?XjGa?Xr=N^U&h{;9ua1+S zlGZqYB(6+WtmH3v9EjYHrU=HU45ce#iO+OOx+qc2 zrIlOGwE9`?J7#Y(dP)^)B5`(tSL$$1MKHB%xD;f+?DfxO={bgpc6#O_q6yY= zGU)gG5%xuk?LY1DcU2CJY>jF*l_#|@I2$-}|4J(9<=&y6b5gLY*_wW#W`>mZhmGFjg_O`ayV2OZ>6?d}K=twG`+Qk7t=(2RMdd z+}a~77$U=4!WTH}84g;;JWr^u4)*KLT(a=T99IbFx@REkR+lBb2oC`CZ!TU%imD~^tixdqlNtptw8n-uXi9YAO>oY z_{o9@FkY2^gH~+>gKmJ;3~24beiE$bg_bqY@_cdH1#%1iT^7xhme0g7va(C@biKO|QiBO_3&wAmc>aUr)c2z?`WjjRYns>0jIbUplsjP7ZZC$X&6(SfmF z$cn3l8wt^3xu#|>puPvWxo0r#hwmEEXEiYOC@%VM@~AoNB*Aw9;gEm4v9_&U@NaN< zqnhTGl7lWv?N>B-^fbT-w=+wcIw6Xqez}L%pq1ctyh5826Ocx{g|3b|55ZmKj8j2o zK`?K#El?ctf>D;3kx?;5K|$mJ3Tt;dSo-W=`t>Ue=>Lh0L9i8KCDxjsvh`p}tA`li zh_~1NWeIX5v|l=TXZ`&(;TZB8Ft_s&djHm!>>ABk+n5e9qOjVg7BgO_f{{QbTV0??AP>CPS*h%1 zVE>12>mORaKW4wSHOkWExWZ2D+@xSGyn?MEwBt0mQK}Zw($eA?0>JVl&?B*UKx0E@ z%uhwelBf5E^O>>{hZxC5!a~S`3)Iu8+n9|F%cG)3J<5piZ-BQt6bctO)VZe)kp^Bh zTXf>2$~t6yJUTA<41=`|k3-~IgVHiwz9 z+WPewq3T7}j#53QpWX@gutBqkf+C zwO72IRFf)!n;50BcL_A^i)y7=xGdUY4> zz)T*z;mw}qKf7_VY*b_Y^Nw4E47TV7!wh-gh(gNtc)h{OG88Vb%=woA@if1 z+PCl|#uJ>vvXSr!53$>Gj8@Riiz9VS>+Z3Lg+3TGZWTf_xXg<+wXg{j#|T8Oy!Zo= zE0ku1(=nu~??xtK_%FDc>(*V!)2l?kwTU}&o-vw)B!o>FZ`d@COG|^`8p<~$;>enS zoQ}mN=%HxT2xx*MDDn2gho_8(Vt>@mbPG0vK`!)I(=NK)O;{IwJRP{3SSI`#Fs)y~ zSD$2MnKOZ)@!CsK3D3)Bst1o<=+Ek(=O$SjQJtuBtj_?MtQ_dA%weX%V+=cVoP&x$ z|AdNxV)<8=Deu|)mK5fQz~3zMO3Lw!tXo7|iS9r35e68-(CC#JzbkLeXh70`39iar zF)7(Y515Ez?(E&23t?A==YJ4>2uS5P4NsFo?&#X!x{{Q~cp_3zgu*UyV3@h|@g;jC z&%Z}}0UO^$IqBSF!Qx`lwa~KWiO~w-*8G2w!HEMEh|G}As0@$g28{zI*46?C#c%~nmNWmn#(8T25;;ZVx{cyZBCCoW`hvgr_AuN`OM z^N_H9>DyN*PcwE^yy|H`cPscS^Yps}!o#rZ#3>8!*_Wc)V7wo#c`T~NRU>f%gN1I~*mbpb?1`ki zTmcrta?rh zCj8pTAe!-zu4b{1Zo)`Xw#r|bXCB>0vhsCI?5v8oW8;$D&*`3T&sT7acVvHxWsBm` z>-rAViSWP!xLR@KN{D0WIfw*7Xd`8xwYIfUE{qiBjv*l%kHqIf7%H6OGjh+Z3%MXe zPUy?w9?+5vsCVx%he%Df%$O3$&*rargHS4Y$PexK1MW*T^8uzw-tMWdF;c@9(J*g6BvK1@a z^zGNr5bIK6oCC+JYj_HPd*DFtbLS$-jZYAB(>nC?NLCIPGTN8@u_B2<923b>eyLm{ z`>ppH^aX=pD-vjCt<3?QrxUXdcX9!q^>9I$KMkafQNHK#yt$#nYAyx51+r$CAv7G$$t~9$Wx;)|meN`;YtM56uH+K7HWb zuB4;ZnixZqyHooBD2mKe+m%AW`+)$O52spwc7l2CjxBkiM?g8OniY(58=Tk+7^s{Q zrYHnKpEU!cmAqf7zu&ENa)o5!Be{`BN6p+ePp*&riH6I}Zgv*CC<1llGd4-_FX*rK z^#U#LdLNg?`b`RTcwfOi*up&+V@?EgQox}?V(W(${xl`SZ{s~bK{@p#DH^;p0|0wb z6hxfzIj1Hk7ya5sY@rh0h@)P93io1CppIVGjoBw$4Hw!atnjadnMCZC4I z4c2VGQ%^HYyPuz93YYsDV%U_;=Vyfc-jW-TY&O&7^$@WD*oxJGyGpP2{?WF1==#}X zV^>{WKuuRbSiQ_eSQ2ZOAM%KP>t-q`YbMz|%j8k#KrglYX;IOQ2T~UTJ`69evVX8{tI_=Ve=ZN2Jwe0x%DO-ATfWH4 z)119^NPi1z=Lx%BmX?-|>x6R~Ji@)1*0o=Y(ROw1QIe%^`(|%F_T|`>kR~~rjp(wn zC((=d6|!NM_RGk|iiIb(_6@}5326R+NRJ*qd^&5h-j*$q5N)U>ti0RY7kfD#A7&;? z6Bf?^)c0I7{YKcqlEtHB`m$|p&23Oo zQ!|C?yL|4izK{HDCXQS_q$u=VJ*-y~J1wp|NWHnc)0C{( znH3Q$g5w~sS#hKi+u{s^QROYqN8|Z=<#p5cigVjGr-|7vU7PQ2!f=a6mdhHaq9Ad| z4eHfvZOa%xJ{xiT(pMFOGt=aqv!>lXJ$OW5QAtVK>-qEOFbp?;>V-c6gbmBLcmDKO zb8|l8|Iu4zuEW`)CjmNV+N!c%PdT4vA&uNI^xkhF$8No}-p?rzqJ4xACD23Nzx$^G z)a2Eo+qdq3uPkYV==;KHJ+R`|2O-4D|HW-7qhyevn7Sj2}J`k>6Z*=_b)WBg#i& z<$?Kc7?Bi!9lzW>dcFoO_t^F8RcN4e(12M>rx3+rK0ENQ!4ce@Q(f224FtX9j!$xKH7>&nWi z;fmjy8~6rm8OcxkRvu8^BzNgjrM-dU$WNKm2U~a*pjWKA@+g!u_ErD{7Eo4dW`?Bt zugUJ&v*)&(9$b$_(R?R^$d3wjXbg~Z$T7+iCj}bGt4%k1F|596iOgMH1n zUmt#~4Ho@1v^;5GkyaqaL#J)7?SgW3U%ij zt>gZ_-mP)Eu5Bk8La76~BwK!vxLFb%_RE!{N)wE)Za6T~<)cEwm<*Waa8Q-nW|9xI z4^)1tt&JnRexM%D$Dlt9Ovu+sF^!3nBN#!-u&-d_no4%E89gVSs2C)ddbjpvVnn8+ z;`J9g<6F%Ye56K=il;H~?^=F-rWn9`t7K7)d^9z~qzGp08rz>6!kox<;_T4|qXm+k zRx^NdQZ`$n=Fx-XR6tSU_U%JN#r+ND*B?srtPHrWB_*F%DH(#!ZT~{-XGj35XM>gbyUnq&!uwl^7XYCITkd4tBqf6 ze@8Z=UR`0jno;9lRxcC6gvV4$O$8&0K~hpiw!u~f+cV)r7zkSmWZ+_nFfFN}+VVN7 zv{3Gt;^PNd=Z{6-Ns5>#nH=$YnV*3=Ph2aun~^^IHJ`USphHW=#eL9RwZKWf)cCzd z9Ww|^Xz6Y6?xxentB;l7tD0}#Y=wxl;zFP7wPQ2LyO(%U)jZYumX;!pe2e9(H4XHi z{k8IC{iIV0qjfkmw8UNM*0rfa=IWEJPwmW^$mr~9O?3FBoHKIeL)ZGX?G;Atw|0NI z)Vd492+lFcax%P@8R#ZU#UUhbGUdCZvk65L*x~3{u(1D}P%w;+ zhTyLJJ>9y?mDsK3p(QcRqaa)kq+&=x!&oi^dU>MWn@jAo7$of=Jlen|we-D?wzH&FXNAHyOBn2{qwp5|VbHYQgXWwp1IM%a<1d!-f6c{}?(f z1C|c0IgT3%J6g=POR5ADA{tSz%2J~V2A`hxN4w3#j`6Q~7<7hpHF$KM5+{${7VUG& zp=!pz)`XvmN@3qYESiAk1J%#zqpnv?=m?n4 zj5nPm*|~C+f!vzg*}Ku@a@MhJwipvtRMr0Uex@tLQzdL>lsV0Thpfjz&@U4%PW#Uu z9>dA@7*=8?)8PO|12N88QG1@KJnG}LIH-HZnw?IMQx)Xe-*h(5XyOz-AmV;0E4DrG zV?R%wx)Ncxaq8}?Ap0SBn7rCL+3Yv(32o7;yUr)~)8CwKxYz^;SM+o$ZAu#0O0WL?efc9T;WPaN zHaahjJR>3^Fd)qO`2e$SQ6q#+wq^{77wZdV>6QoQP>;U|?ra=?sMs8(hjNSCmlk;G zyoxw>aL#Kp>T+YyzS^7bPY!5kY;5E}yu?Q4({d9hE@Sh^?OJo(^4OG=%N^18-nK9z zFy`omm&f0qSu!#gKLdQMri&6uo_X!U-4=C%<60rptSKh16I0@Jk*Xy11waSE^ro{P-iz#%tv!J|h{u z>RYAj;KbU0Vb)nM#RUEF>vU!Sx!@k3)VluKc*+uVy1tDNgJZ0-i;})!` zqQxT>rj1coEMHPzX8LzCH8mZouwlO-%5VUiN&h*Gr|*xFA%@3rw+xWAV3mGjJeGCl zC#0TMray~?3mem0C31n|hz2g}IUfXYGO^)2#<4m;%qn*dgw!ls9RJ08j#S_5wJsTY z?dSGNKKeHoAZSCMXam<#s(PEvy$^gbL!3cEa&mU|k^b0&^78lJ7eFyz$&?~&L&x30 z21Lm;CXCLo1G36zy136&RSTRT6;jj3!v9Yd`#Dih+^$V)Id#gv1IU#F344$~Vw%@eHAm~ad)(Yyy4*8QbzBtWv369^|s_Jj_rM{~8 zM!c{n1d_M^u?;-Vn(V*xu`n+c=UFG#Z3xH;XYIcH`1AGObIvUG-q|-U(`~+|7^2`I zk=v(N_wGy(V&bD|i#^Y_9C&x$t)Hx&$m<+G6G=U+LSwAS_ODP2nzhR|s@!s0`0!)H zR2?GOV&?rW=QAGf_^`qw56MQ&=b&}6?tRGefhq)sDXR7(BA>X&K5^3dZE<`X7_}Gs zOK`Y3F<}wWXDFi#G5=^#6tMx;nI+G!qIp-<^Z5jsTTXVjUb-krtP0d(#`x#J;I@a) zGBR{2K%1T~?C;%n%uX-q2`v-na(N))H)*wD1{7cGdY21RnE9%y2sbW;9 z94@<>i|yB9?o>Bx2Yw$Bss+2s`0o0~#)&QSH?t4vu+QKh8p|*mYd){ym$&|=gyoFb zDNRFGXlmxMQ2OIrWn#&F9w@kB*y?gai;&2N%1@ln`ZMSMoPEO9q$dGH$ zDi;@y5TlpxuI<_9bLcK9W}@;AEwQ++bD;7yB@e}wUCaANn7B5AwaxrER~CIbijJ_8 znSQ>$5jfIL`+4i>O()e>yN(*B-Ag_%c)8>7hQ&ow(7`RLEX&@}Jk%_=NiHtcdc|rv z=M_=Q{3H!tU0vxaO^K6>6-*PO6+{+SWyX7NoTy>sxsK@O+fP8K?Z&a@zM4XsWtP=o2|{8 zBNBV{>Xq3v;e=v~^nIu$<$wRJQ{i|)E>2Qnow83)3FZ?~^hmO*s>T9#A3M9-!yoQM z?|>ddBEho25k~lVLi?wYmw|NAXHL=3WmS}wmkW{t3=9o|kHgFXV=`LU4AtB{sSGGJ zn4yp(b^;yEH`0{@Hgr$_5j|NUDef8w{cQ(>JVw6P;8c~DmC52LpOJpJyM)BsqNg@w zIlI@j-Zxi^q|3u#oqG@H=>0>wA$#c-ZEs+;QRZs2Mp$ckifWUX=^v6OEx;Na1=n)) z@k$UiKA!$YvF`}g{J1Vv{bei&F92TfWC1zA4$%R6aU1YD^q`%C;neT;?BLE65YQ4 zXYa8R|N8R8;}XAq|F{45-+0B$L1GAFNDMiO(}o)SLD$cK|0<-nm9fvXak-^J;Vf6V z**5e-A}FvS)+E?||CpOe(c>hRX=vnPl)(L(UHl-bUVz)ugr;a)8b}dt)_f}V!qP*G zfmBqI@4cYzH-e~FKvQM+^w#&Acw4w5{^S8Dy(S#QAQU@2Vlxf^M;G}_iI_%E&cExchbu$!VIq3KAO!B4H`OBE+EUWhqYmI zLbUF-ZC3z&;$gx3*6=b_T0BRGkJV8HCL+0E1}Y$N99u*|H=b(iO(w zhqgYhi<*6%doyv#nS!l=0Z>zI$r`||Le^wvi%6h1a%4V`Fv;zwP4wQ8Z04X8?FAtN z;aLP4vCO}(i}`}MM(**W>D-+k&xtz{=)$>h9DzJT*_b|djXr*OU4cBOr`|>qLk-)iRCMp8RY|L*KJdS9Q03TgTC{`a1~w8MtEfMR5b#1 zV!t{fUO6#hmLa?Y&rph$apT9=i28)7O##jmVn~7=T^?1AmPw^Zlq8O74BFsVi=%-* zfEI;-m&t1g2^;(q8p>#(pnob!000)3#f{heTn$%a#DKKvPWS#I;KIGZpZ%czOxY(| zQ_@1|0tDGtRJh29FCue-qoL&)O6ySrWoc)PFGvJTCVCSCPXXsqfGuIfTf`R&7}MZ4 zQ2h7w>0B+996i@HmkwBbx;u6xjKsHNzzeuYqFw#Qk;MkpY6Khp+?n!XQeF4YQ4v9T zV$47vItT68=23ep*h^6mNu23I1QtYujbdCduJFc%3-iRR zW8jL}7k?Y8zSNVTdl}S4fVG~De8yACL=ovJDMX7v9WQ1jxq2(+m}kfETb=3pGi@f1 zybudzj**tYz@$B)QW~&&@+ogGF;JS7bPDg$a`-B+36^?-^hD7H3mb03BRNR2k?fix zIq_qZE(2XeBah}kpW^@;>fS*}7&KzUr~Gf-Ja)mIejmlRjNC9~g#s%FxX+|B_Qs(7_Jr%&AkS2-2U_hxhyC7afS2 zndy+G%&hDULCur4{jID~V$4Yl<h zx{T96?BXla0g|JstzEzdXw&t@<2ROOq}QpkKL6bKp5ho|^=>=M*zo}Rx8Mbkr;iq@ z+BtVkV%9o=ks8 zkaRa=9cB@RG!|j^=FiO#vS{K+%7Yr3BFSnyAlvoA+gS@(u(T5 zt5;BK7^jP4LK&5)tldd^p)(RwcF3p;@$#Ig_?P0hVKVLCx9rzC-AUSePWZd1ANB%^ zM6nV>>Jsrt)B@BOs+XHMIc_Q?qY-JZ5b)XRr~SY%o}uJ^Zn~&_7l72Eu`gA{xu>sy z&BVAEr%X-+G7(NR`hR^y^}U7}HvvtLV3$>HiYi=SGdFUj0gUo-lM)~57mwkTI#r4D z+dqGn(fBu<_vFqSx0b*XS7hOXh7FVFNCQ~O%V7&m4N&(DXJqFYD$01mpEHc!tQNs$ z2O&+#A=~9JQE+rF{=UmTKU+CTS%NlWoW}p)FCcmdyTzvEEc4q!CdN>k$&1SQ$0GPL zXBX_M(WB?lSjP*c1#{nd6p+0*kOBfDjKeEgCU1! zC=qB2Tp!Vb6~MirFh3U}1y*A~iM)K0HN0Vx;92G`@jyuObLX1D`Z}_8dVtD24O(>> z4Ue|sHv;102e;s}v$NqP4ysW2{^^#uZn6Cc%P=@}s}qLN^^#hw;d*emM=o%njD{*a zhtBrOxiu&m6NeoiN5CM^$GLkGfC0jEdIBRr=rhSwl;P>^lEiv@`r?HiOdBx)*Pr=A?Ky>wAH$V9 z*SH3q#H4H?-J`%EGIbo?TwMnZ9vlw6QzH-cT@<*V&Fh;woR2mA#uqH?_4w7^0Rc7n zJ2-v15t6Y0OjwLQGEpFvqEc;dZdzjTIlP0l24Wn8`O)kK#E7lPAp>~0sPdw8&% zE@zg*GBOeVIP41AlF)k<59GEkuvtntU`&f>V{Ntjzf;-Se|38?1Jtu-LN#beq6B!t zJTl+kBU|=A4c(mN6eE*xKX30awj2#Xe148lvQxOtD4AgjWUDW;M}G2@DJv*nJc-dI z>tq*~S5#Efx0$<#%ZAw9=N0;CN1rg4{_}#28>vj(Cy~hk6^P-6n(u3OTZ(?o=+TS! z&0RCkVwcTz?EJz<=uc1z1ZTJ9d^n892+-rsn7G z0XteRR(sFC%5weq`dLT6KP`#RX2%;ZMC$hhjHa_kLG;%dRN3b%)<{?MODVdn#x?m>$N>38)aQpiLF}Rzi zI(S3kOHSm8V%{fymB>0JZF~;d&Q}JE!RWD^w_wAFDal9(6AeiaL95^`h~&%f-npiz zuIMAu-y+Hj17PKn?T<&?a8>>O>brIp43HSygo?rncFxXtVq5I%58QIuyLUT!7k%s! z$T%lY+d8WmTtyljlJIPYl8IA8basMl_QQvZDZyjwKiHN}Hz-K8t91Xqpt{nc=SUns zeE3Rl2>{h3D4BS{G9gB_ep5JQ~=&c>%g#_cJCJPxBm0z(=u)ZbI~@zNos6K z?=tDpqlZ8{G0Kr2p|WEU&&B}MRE!5~TVNSFe0jGx4XrmI^mE8op+ENn*A(<9#SfrR=9UUw8V z>$j3R_Xvoxk(8-BYm}I&h-29y59A_7BDCxNJx#c6&{e7lT%C!+3#uZ~Wr-sF8v~<> z8pgOuLx{zTDhvwV7G{{jiU8eP9N2Y^tvg_Vtbz&8UX&QYd5H2 zm8Zi==b{B9Xa>&pD0Qs^>;nASKJ)YVPE0=C3PvT|1D{7Ex(9P~J8qQP;_0X$O}>cm3!akZv_Zu30@; z@C*e7hDQEe4J?I0_JOEe=N` zFYkqz>yg){-YEca@!n0Jy}~^v`-_Gd+OC z7{(s`z;M|Rmhg*)QrHe$(RdBPP7sIOidBl=(Q`_$;gd)G6KgI+T8-#&6WejmO(!$u zG^i;4>CNxef&~N_@Qe%a84-9ZvWMqvFBuJ{{o^X!C~`&TjfVoK;&mwPC|jzLN0%JW zW1S-yVARIfx4yiDV~rT<@v7G+*SJ0&v1<#n$j$4dsYobC#qt}chR*_neut&>46m+k zJS5@^zFAtH0{$WVM{^;bn-1<5FyrT!>{CkDM}4|Fznt>eLhWLlvNM(n4wX<8^05?i zwa<6D!#NYUN!D{@I&S8+dIVw4E1EL`h9QTEU6c7B0x@$W_?3|)gm~S*-wpaceK!RlU0@hn?v+qwiw2bqAplz2=ssdxNA=^z;8j2rTB*V3&TX0OK{^w} z047wM588!sg3I*#=_>XWf7$49lCQ}SW1UCMKmGKRoSd8{lz@DUtYjEbXh%O6hog_v z5QVFlEKxy4Qa{~-o`coQ0nPZa|GccPO_7BXpD!L7=?Re&%~B}fGqe8XOz(Ag-|xk7g#J$D1OD9=}RY6Bv}oJ za0fa+ADSxw4{!##8~q^7$G`X*GATip8F%vW(W%W{q)z7Alag=UvVsMz zyZ%BeGzpbC@stZ%2iAWkcsiia)jl_MK4r2Y2$x*i$$wtJ+oBNT0Ev|U0uHx3zgdGi zX&nfu9qfxGIdQ~4=~{-p;1BBxWT3N7*t-?}xF&gr`4LO8eQ}&?ez+@9$j+j!OfTVp zFU{0oNE?7?8JiO)phW^9-mHCxaim}Y!C+FFTeoH8;x|TT_AEV+Bw7AoX$JZa#jZCc z9bF@Sp!(h1wfAAmAsx}ECc1P8P~qr)%Y&EP#+GiCo@q65Z9dy6>|S`@Vz!XCN(m6m zaN8F^J~o{mi}$MHBV39I(eH_&)EPgh>DBD%)v_x)e+-!FG zoThv|Nz=LiJdw{edY|^~na!3LSygO#5MQ0?0oq8zH)~H`2-k!$w#~s2^s%b;702mx zDz?#}-d6SKOci}5a4`x10B=2h2$ieYmnKVT*{3jXQA2+dOa)7f2H^EMx8#f3`{;eYZIb-dTjzlCpz_g+^_N+$4ggL%@}7EL+VU& zyY2L|lQOpKd_^u64^cF>0>{#=OhJp1=vR&)G;^pa*z6VkRa#jfXJmXpqoL0G|42{Uc46DLCBkkz=w6b`SVlcXlPqntQDL`>TQ1QM z!nFI_+HFf36*WXFw}fgM8ieQ>VXzdf5alv77IA)*uk4Nt_?Fj}NxNubvrzGSMsETZp5WaJk} zwm_y3OHkv9^lcq5D`)zjKAn$C9lY-`)+mc`()X+%tq=(GKltcp=jq$q&x=q_oL|c4 z->Cd$gLA=g!)J7d#?O{6JzU?EkJy?R;Vd;m?GWt-SRY4ax};*48n@bmH?VMH9%!qc zk2u+kcBOR2AvDK{3pJeV$$=lv$5gQY>@R(fdg#s}qlf7n?~x^!TC81YL32l;K(SgF zfBscsje_7ECpQm}-$$#!4c?-j9>0fr6EG-gVc*zIj>7OJCL(eoL3M6hgvmpQiU=^? zXmfB6#va+`0A8L1kAs(%v7L4TTVow|+GRL4@9Hzs;hLn^BCcvjg)QK)S4~Krni(zU1OhrlFiLTzA@D!B zU0AtzdTQEUL+9$!0n)P;unko-Uw)qTmwH?Vov`id6&p#u?~Rsn2A{zL134a`<^yIY82IgJZ=!0>B@8$(i*T82Y?16+eb*}hhulw} z2Ze-qVz(mE21NNVKWHZM<(L#u)_DC=F;n z0(|<_MU%Ep7xUhVRYe4YfsWb@@1Nj@*xL|2*?M!@%dc#$3AL}!gNlJ*Hh1CFy%)S@9Xw~} zL~fIY7!s(lVhaNq>4TUUJw2-?3Pq)jzJ05mGS<#+_-Qv?a(5M)BDy0;6c%a%36Q`G zU@dkUGrwGotuyOlCj^IweDl8jZ7mu^VtcUAK6lbm7qByq9Xoah9^-&FPCF1zrza#7 zWnMC}gye*QymF{;R#^Mv1@Jez;Lo6XAb?p?=ZQ5a#93Ban$i^7y3_v3R(J2FN4GH9 z5x3a8Q4iCQ#wyxzA5IOCDJiZ$3FEM-f*}INnfIdFXtNmX2z;Jt(2y#y1u`VzN~e+r zWqKY`D5?34wR4rHTTU?_`QqOp0sjwR;D4nRn|xmW09srS&Tm0{z|w*%VMzK^dsV!cz%<*+p+^A*zM=F7gY+s&<`+&y3L!EK%l>8IEU)@8};S;p3# zl$pzn#MkCA`K@Z`oZPTBzIA1~oB#JSw?>=fTJLK_cvj}xT#f7xO%fh{F_CvYY_9AL zFr5<*+(^aR>Mng!GErK-g*qtSe~1^%{bmSkUDkunr?UGLWtFX4O!3Ng3?9$%8leS# zaIY?y+C>e>FCGFqW9#H}^S^26gktZY-vXSA9tS5JU3jR#Z-;a5FZ%||_I5ri>R5$q zy}dK-lqF04IXaj5S1jdH8TrF@S?UwkB6F|CfuxmYm-Igx*8O$QQ1$$U&CSg|BX?%T z^0hV?uiFj1N4BXLxFulVtC@stYkA6d7Z=C_sJ+H!v+cg9yW5@C6T1SNOnGHx<@!l~ z2IDFWf?TQWS(v+~hg9Bbr)B4*eIe@{2X948_5Y~V9o}fBB@SjVgmD*9?^3hHq|dfX zoL7bw6dMFop@33V-^h+u6kB?o3Pr`tVJxlSm1>5n;e(O*_^@xbp1BeqonmHVns#Pt zBGu_}t{)1hG;EOlu5XmL6-Aex<|<8GTBgHjn^+vT8)_V!g7#(H2)^^J?iR^R16TWj z7dg4!$Jk3t7e}8fnNxj69@9(Y`e-#lPW2{&5iTSTTtK8k9+_>bo zRPM?h`dgQ#skB|>_Iem-j~3s~>z!~7%%dBI+*iu8jsnKatyfn4+pg!g`TM_oOLMcb z6zxB`DDugzRJ*6^K0jMx#E5P9wYcHI=BwVORPyDFTd+M@JsOSKl)##nK4j%98epTQc^fqpc^vvXG z!wLVL$?MNa%Z<)w_fbxFUUyB-r%|alfKh3c0gN?i`ILNnO3~|M=0(1S!KVO6PLvmo zL6%e~9y4+@I$hXCF0kEmAcCSpx3sk6mzHiunkr5eRrK?H=gGH9dnMJ7Eds-ghBlI9 z|F634dh`04%ttGsVDhOX1&JpnCiGCj1>$N_B$e0BvXb-+0Lng&w1iN)K#^n<91`LW zHYf#&Pw9H7*8%-hXHvA&E>44BxohlY2;MqMX_6Db=yU5`8y<%Qs)tVwEK*QN#@RFe zy}%VEVD6k`Fu0;M1WsUPdp0g<1*}Y}!*z>9CT}I+kvU+7);bqV{`>*pD?uA;TUz2l zV3;CvP8qQD0%+Pgk(-Im0tGL0fGq{eoOtpi=-Dzr!}U~;(+>yW1d0x7zig=oBM|Dg zt<{P3-3IRm?<=tJ8H`ELDRAU{6$SF@2%fe90!IM(amP5+}1ICwp9JR_F(Ss8N5*lTxWvKjdib zNTE%+drB5=$d3d-+i@p7vwVlrp(|SNaWxyQ(E;!HOsSy%r+m;5?)oac?qoJgi#*s6 zs@-P?G^=^#*SH-)!Yy9Ug9^veD}_UGVuA2Fn=)QI_DxxXrq4|Zh-sjw%R4~0R4Mv>d!G(C>7O*;)+%6Frf@cr9q$D!dGgGY;~J#o|%I z>&Jme`$0D4dgO=}s;N6d;dK)o3L;LM?gS=Ls|;C=B*KN=T}E%Ibn@+r;Fz*ETo~#N z>4PZB$Q_y)7aolYMOwyST{tdJei$AZIZ85)DJzq{hn|D#-uGra0AdUql@CyGu(cde z%lGWLa~zC6m@faSrlw|$8kzp!1C!I!MX7CID5@Yije&5)n)e!pS{*t((u}855I<|2 z2sKg;6Nj|0hgDEIgD-ufN}vU%;=Tj&E(*QL2RO&9!6uM|nn$5fMasvmYqHf0knbHA ztMXub*bH=Alds?$h*HOVRUZN7+1ayaYhS*M#{5O?k&X(C#XY5j07z*#-U%~C6@=$t zE27S+2d6UTj>8;f&FVoBVyMQy7fmUamX!nt2iMlsT_x`$%1jLL%uBwHB6(%6(lacX zQMZv^>!O7w?R}Ze;Djhk2!#Bm-)r}jxN9rU`ye^U@hLBW?2NgOP>lpNEs#*z0toIE zc$SUvt-vR2h@BWwh_)|RS0{}b;#G&Phj6kI=F1_Gvox1`7RvqG$TADE#urpX6!PpK z_opWGk?ps+eT_LAFgY_Aa50grs^~@=))7b$zG(*}y&R0oA)77JvYd#dY%v8HHU)oC zI{16ANtT5)M;R9ANh9&&u2ASAL8J?nD*4?sBsh5R?;FB4kr8?*u({5$ zQ3w50@AH{<8477UfRv&MYGsG);|{rbc^ptnJ*ZQW)8uExY6tba3sUIJLdgVXfl*0G z$$OY&;_wSXP{r|nNTZ9r$kQuyLH~D3hfeOnidl;~*3ihU5?01+(j<3*z$*&UR;uwZ zB?5GiD@HDzrRx3YOWODo#X+dBb2`brLB>pQ_=+0xPFTQL?H4vz?S!%$Bx${)4gRM9 zw7o0j9}Qreq4tWgNW6@RowY^y@cGvj(FMav$ck%#Wx$GcGB8kxA>h+{q^G-^&O*N9 z$0H6XVJwo^`IF|h?q?goA2jgYhVL`NgP?jM%47H&_hi5YHhrqwqzyf5IVoM#vhM_z`w6=}>@k@`trQ@d|3 zTD-UeI-Y8}PMrQKiJBxHST&6oK?@j99SEr;pda&ax8{BM{t|sO4YZs-l<3vaRrx`1 zCBy2Q{sjx|eNw6$MJA1Nrx zO}A>y_pbV!!LC;$@2f+^)vHosV}o?6Dh;J?#I?VwU96p#ECyRql xDVDy=d2gm0CcEFvqbF?qA3gE^|KmOBJSFy~JBjmH7s&{q@A!Iq<~Elf{sCV9INksN literal 40161 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 diff --git a/screenshots/chat.png b/screenshots/chat.png index 47bcd77c21dbb9244df8564b73b535ca4b8b3eea..5c23753f18d8b0ad5d7bcf0af2a8eae3eb85e580 100644 GIT binary patch literal 58654 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 h#y%_mXM-XmEa+?4!YA>KJTK*n0HBe*s=$*yaEL literal 42563 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 UriKN*$-R@8Q$Cq=!r;#T0xnsB4FCWD diff --git a/screenshots/screenshot.png b/screenshots/screenshot.png index e1a11f2614f2578e530579f6388264a105cbc23d..0cc36587a328168a9f5b96971cf75e2291dd39ac 100644 GIT binary patch literal 10947 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 UV;OG8gnEFVu|Hk>v-_R@0lDZ+rT_o{ literal 10910 zcmeHNSy)q7*AAkh6{Ib;h#=U4pp`)x!Vo5lim41Lp93;lgoqHL1PBlywAxxlKoeyY zsEQymL>Wa0K~ZLs3dj_afQ%s!NDx92lKlJN_dWm3fAdc_U(Lzw6!Stasfw z?&hrW#f~pvFqjJR=%JG^*aq---CvtFf(t#Kc^X_4uqT~=gq6{>I55~Q81m4;e?;G( zWrp1L38YN%+2`<6KW_Va{V$uQcb&C5tbbL((6P03`pM%xmx}I&U%NA+QsObO<)nq+ z^*)a$V|%x+-}1ZvFYU@FuZJsdRJugmbM5jC1{ocMBvFyGz*0(z{;NXKDPHb^s zji4e=YKROMv>8k-=E+x+Sc`u-sRnYoA4|t-u~R{EsZgil05fJPM`Qc;X&oKHDnHXc zUYsG7LQAtnz4~>7*Dbud_vKel#>{9|0TumSnP$$gxCSiE+MxJ!=}*LnI%b@N!PZ`q z{kma`Ae+5fKv=CJ#~ao0UUH-2`zq-63<9$nJ+xeVs@IYk;UQl_*D(836P=u#GRhax3hi@?I(FbmFKIri|~4pR*`Xxcv6!H?=Dtk|ZrHTG(5#O<+3DuG%?_p!a?e z#*H*_z5%n^zyG$9cC>%eJR3hxsTECTOImbwS;zR}B=^aj`8bq(rAbG2nP$7#DdX=g zyidf^?JSXkcc}@L1lhwRImH)@M1xO!b?n59`z=fH<} zhUP8^5+jde2Nf17d)yeox~$r%-0T(|f-SOqzCkjnsI%gjusWuL5(y?U&4W*Fby!`9 zoAJnNH?Er{hLqLn*RW!_Pb8Rnesi3Z>qnm*tiZnBY%pHGNb4A?3Xu@l&h~;k_i?P4 zM`=0+ZMcTT9G5(MyFBSE$}i%UqN1Yb^PdkVEEW3&F3r4;>F{C^omB12u~W3JyL&yv z{VFOdfna3FX4rX(a8d;m?PM?Gr>4HMg#57aSXF6-DC$iK_0CU*3M}7#ADqu=vTu%_ z_4J=t!^e^>C(G)1GgJb&KS4vxcM2PXlvN&%+OgE{=P)CCUwj7j?%`oiYC^o5)#x=t z-+C(ofCy2qBB-mK-=dRuIO$u;2sYiwD^1UulTWI)X@HiD%8Orqf>pI$a4c&O&uB&V zp0J*}k2Q@EjO(=pru)EWJPFXkUR*w(g5bTFTM2@;E85yOba4LJ&Z=2l{+S4v7Dq^x zOM~d_D=j-sGG1ApJ`%P|5Z94rgg>~-z_H^Y^zTNdnfT?Bfpx4UvlV9h_wWBfmRxzE zjd(!Y0_xJMq7<=`GT}z`(uJig0C?C`py;&2>OST_h^3&|uHLZlTige=yzN!BEp@D= zvN(Q{pG!@hhxtfFs%oE2CX3{9IN4vL65e zPc*7Z$mp-1v=F^gO}M?qq<%lLJevQZ#H+@*W;nd#2_Dszb&uq3Z;czi;#~IP!_9Pl zGBm-3lggNB{?C)0nH7uc8-K`7oCTd(FZFtm^g{Z}x;#-i?+KW>p{h(c`dlo9^#otw zl3D(~%YLZ3>z0ODd53Y`EgOe;@yAkD`c$dZml7K(C*+RqZf@d%eufEh=_6YFm?pcG zg`dv}NVS6ly9u}E9f8QY@y*gr*7^(iQX!ivkEKeNHT$32il-k*QEFQm!xigE8>|s9tf@9?tkelPdk@H~Ro+!RDjv7c(o-*{@!`GW2Vx zr)r5J$#|cwHq(E~ss<}{7m5mVv+Cv>@JVJ$klzm+sIJ_B1+!s9FwZ(@K05@n{qTqG zk-1;%E|0!8^nS6wr@*zt!`;qeW=J>HHoVSZN;Gs12(VZ2bIgV9!$Zoi=T7~scH6TeXyRj!`}}+gVphbTe=(M# zS(P+@>^&zUy!V7N#1B%es{M*Tk0NB1vT)N6t~ZPfgF~hwK`J(4VY`tA6S;U^+lRMF zBt76^9p!-?M|`kg_r{mVg!p9!hU$%DMm}n`2*rN24NN0(Cnj2-om5qEr{h=LHPh_G zH~}fI6F@Hem~rie-h%DOwQXJ*OQqMxEOu9;<*WHfl9=qAt0NMNT2MKWr;Vwr0&jwJ zNt$c}ugQ-dw}TjE5S5p+k6dpG$U(Zu3=?k1vnT-@xX(}YQxNTbre@fS^S!2%l;xp) zd6MBN0pO`Rxu>5@kdBp!rciCf-O>@0L>8MJQsza3fP8jHuqNtx!j+Tt?qSJ>t^f{L$Sg*g9~hF*^GB zpEad)iDpMm;s!^k(w@$gwHK7*8EdB}?6=K{(Cz=r;#nM6@R;4&!RfEWS&pUXAu;2F ztTf~6ue08n074&(s3Ucod(~|QBm4i%Xo74(+ia$M8kfCVzEnz>zp0cV2e)xoB{%iUb`uv&hh^x(!iv<(xU zQ|-zy4`w7&b&}V8YSlFOFgPoLJ{@JF8RAdw*R)u4R~)}r)>F+fN899p2Bc~*PQjYB z)jZ5Toaza^mFU`&&!~3o4uRVXF&;~5@?D&WBPE&a%CH9J3d4-$1TAEsBwlkO z=#NT`2D#Cu+&()yRuiZQ92<;4=EVx=Vj`}$noqP4|@@xucgi4 zaF)0vJ&!_{7~YHi4sf_w;%&bw@uk>sTxjD+rpruJcQB(8O)_`Q;%jSx5%wELH8&p^ z4T3d{y{L`pcpx`M3f!lBGW0~_2KM0fXoOvV-n*rFSyT3Spf3P4NW5_o6{@9X4AaJU zo{;uivR{6Wv6*hXzaSH)a5F#!m_I5|ZO!rbgudxb^!`t>k0f9X;HoX8azn-ktLh9$<~MX}LFevXm{qs}}=K z4M8d@4({4>OZd#!@srQZEr9Qj35UGZ8>=F^+yp=S+&P!|>^ss+HIo|8b;?jLjL{|? zTYG$ckP!NclP~a7-C9@FKYc%5`t&*Jk0?o)eQqmzqvk36*dvlWN)5Vr@nZe;O3$v5 zk&!pdhwGc)&Acxr(Z*eJd%N<(3?M>-BYQ4u)zDf*Ot+(qIs;IG$g(3tV8^^w+5E?^k56^W0APl`vzlTRK0%|pNnOrggg&cy@+O_d987$`kIhuQ;EhU3_%XXp z8Gk_EXc77-L4KHiB!W|k28U;sepj^WRxp6SX3WN2;QII7=f643KQI3?`2V&X{~7$B z!T%ZjP@v%N_kQ=;_domoXW#$q`~Ma7g&sEhBB3Ockt^oUdm_=|txF4*hS zm9C_M;6n~;<@Y7$s-9Z1u7Uyxx!vN8xnqtNqI)=%oCq6EB?wf;hxL&L-Jz$?Jf?Re z$?3jCUvm0`2M;2$g8~+~q2ivo%3uZ@U3Y~OKs0}(eQhmXr@il2X9!t?@292r7y3IB7mMpat z^Ssv8^F;*HwSHW@DWe1nB;xKzcw_@_VS{v&RrnGAEL%&34v&&v}nPE9>;(Pn(Ga1g&sg(Q^WxW%pj{+%@g z!ngNmBm#}PCx}k=quNttOJtHB#TR4f@HO;&;O2qNi9q8;mPc^9yEZm_v+s2MEIs=9 z<&|(Yv_*+GUj{6xSD~}PmJfqyOALq=+Rjh{JJQh0xsZmC6;jrQ0ZOQ?^ka|p%E;Bl zTw%R|8HzURR{_*VL$7K>NWKfJn@bBwvDSxb)`+CpVK4U{OEYZCvIsFn4^?(%S?tph z|8>2a6G7CY+e<>fHTKRx%-5T_+wu=>wOwfJ%t2T}(xd(I^VB6m+I5`-D+jrV4(21g zFwQfz#?cr&6g?pU z{lgGiO)gNr^xA;hjUD|>eG=$I9nj#4Tdj80Fr&P_H9UJ882Y*R3n(z>--ttzgvpM zehb%R6XQ@VrLIgY>+LWeoAn)@E&nKIhzR!kW9jkQ%`FwH0^6yQqr_t=mOGL|2g`Ru z8k{6U07SjJ0WB#L0KXk=Bm%8FJ8Q(S&>T0(y7idm*7pLe`nW)@0 zC_*?%Yf@C&dLcU6irZJ}^^^gr9k64UkbdjBzld>8)ppHl389K-ia!d4HIKYIrl&6w z^J{7>A3b`cv2$nF>})9U!i5X@c5pK@5=b{N0K#ni&4;bkXht}Y|D})lDw^=|2iLXR zKYom8Zf*|$@aBe#t7~9vtPN5ymg=D2b$OuSyCrcwS5HG*+l{yi>_1mkcCP9Nq$wO; zeYa)}foZ+OIhYHvnA~6!(pSPE9dXIISl0IEt4{!$0CWAtmuGO14SN% zL_J0gh7NR5Q(y)l%l2}YN`T9z+KVrqE;)Opjh{!5S!1ZuD7QR&%5*H)!G66qU?b~! z36S4tbzvKtfTWCmHJ_1@v7*Xbo5bq;xo%j7UN#)v&Z6MWY;3Zeu5X=qT3ptiY{?o( zK^yh^5#sgr^#!lDnB<=>?$RvopMvX`oqhhjyS?Z_L1CepsVTAPx+==wf0w$kcWaqX zow2p7&kGZH>Cz9tpN<00u8zRrQ0#_y>!{hY#PQ!X!;TVHfd`nr(oOtc*R9e2u@Gb`%mC@<=eHyIh&>>WTdAoipd%;I>No}2#Gp7Xj~6Bf z!bMdoOvf(Pys4>)Gc(gJUg9qHdbmHXt3!;9jiqZ*FOUAHZ(x9x%+&z#o!9pCRB?Hn zNU%H~R{Fq~JOyNZ`kOb0+RHmzTaVg{#z`AO?Bc}{Hy>UkS3G*8%Z^)gb<4HQ)Z5z; zesJ6tzZ@DA6g1SI)CIX9lhX>cLP0F zW7x9vX58G+Juo*jrL9^=iNmqnQVy5f@z-C+@pe#J2iSyKuxo+g;iiE6T_3$`<&vqa zT%c=b*~(VN2B`#s{pv!K9ukE@Ma>SpW3>$ch?u7u6>9vbnS4Ydc{>SBw~<}C+_XY% z5A4|C*-&z4BKgRU

w8nWBDfQGW>XlBh{noHpFq=|ao3%g)Ws-9T4#Ar1}>0#}vx zk9l}_aHglveyK~(bI40|kXaR~+J%q1^^92OcL?oYgrz!{sFnQ?eL z--w;yH^+Ur=VbBw$x==#7Mh5E(cM7e-Mu$W51+UYRDD*g+bB;y^62?USDiX{dU{1C z+2mVp_wWrNfW}0UNkc0DLM$E+c@Ce?hw=rseDKRc$Yr5B)kAh#$SSO%P8V=54WnQ( zKN}p+dwHInr)J)3k(!&Zk%KfWvIXiZ9gMma<-BqRCsdp?YfcI zW^3xIW8j+Z0XzQBSBHQ6Qy2f{pTft#^zpyV<7GU|u;cFDDf{Y%EF6^g1@mULJ5*Bg z58zJGvd!lMjP`a+uCdRE=_#6|IP%?#=of}w4inxVi+Ar0K^heeZeBZ0(o4%l&Y9&* zVY_K?C(emJ~`sc?NGn6&F9eM_o5xO7hC*1@9v!mymUA-|EOp2vzaNe_>n=ru(k(k1QXY3C^4$n_kdPF}29xJ%$;?Ag#eM^2;_ zrDGK?7wnX`_j0RxZ=RMF2PZ<6E?e&-5R?|)X3Me=u%ymDV(+B(${CZ6-kXy=2j@hH ns77?o^A7I{lGQtF_s{!1?|8oN`==g98?t`CdtTRho#%Py?s+4eOIJYNy{L z-rVxkkDtHh-+OBR;bOznv^cXbR8OBao4uIuI4)7#=T5VS!+fCj)vG~0N3?B%uw(CK zV}5Yh_w9w|9nz$2kH6PF{lorm?c!*ytUdlx2`LZXeX3xx-OW@mjIdY3 z^$BCmNBN;0m?N3FW1{E}Owq(w5$N&!#Vv=>IycLWyI*U$@F;GK*gC zrag1-Ac-YeWm{@)v|^pSN`EgN6x1M9gk1{P!pU% zO$!)GN^}gz;@XRy^!UDk#(nMlKBD5;k>^#+Friz29#g2A{aMm5`B~@s69lNg<3__r|L;daY${g*vDjiMn_7bw*{?mF|1F6ZOdx@{8^@UoRG zx6GqQ-mAad{?jUL%}3GmLs8}r{`SO;MQixa^5t)QaO-6H!=HYU_VsaB-Vjo4-6;&S zFd>NHt=IB2)rSH{q=Kj5{rPHE7^`FVM^nnmr$}~BEm!rRXVFhKWmgw-GJIwRC^9Z~ zd67L1Aq7p-hhwyq^n`uiWCyppcRY2O9e%mG+D1&@Eus-h-HTRNk!*$rCY%*Q_gMOE z8Q1ba@o%HD#NEp7s|I}}?8%ILTS{@4VVfgZkg7AoEA!QT;p@}7@2AXQIv)nfu{>+c6(@Zz-Ll%k!L_7oYeK6X8B1%E zSu~NpZz6~NhqiYd3rJ(uIod?xqV|3Q8a3^cIG78lTCZfTgA4xLLW$0+5FY2s) zezL%#>oV|I*z<2M)2>KCYhlyMz!nXYr;L*FDPzewd3hd6>CjY#7+r24V`+dwU^gqb zsR;Hwx+9vr*lnu-->(?J8$316NLP9DQf%Y1USu`%JHfV-d$i4hYR%jEkR7V=)T7yEGY7SUuaC85WK2vl){r)Co~g^DG%?MjC%h4fxy`QcYl)m@ynbD^y-qdXeJ@5CHx-m0jji~H4UHYhY&FWZ6(87B?0zGV* z@w-f6BivxM3OZ%zKCEfMEAl(r&N*AAnb5l`8isbyCOM9HqACd-;k*=KK}7n&U|8R^BC-! z4{Uj1o)CPWF%-gT38-PGy`8Z=&Q-NJ-YVw_n>6V2qdWM%zlh~TYIY-MuoCI zQ%T^=H7G2z6*R_9Kbii{(yq93QVs={yllqc%K(>|g-Y35J0o@|JlPOG6C-NBT3KGM zmS~5^>1UaEzZicClUa(VFW2%mb_yRq#xH#B1mi<`$V}3HV=YBFn`dV!cC8RAdPgb5 zjY-FBh~e0!4^A>SJRq*DuG4unZ;Gc-N1bA{+aI5f?CkD-3QNgw%P=gajyy~9y@Tq7 zO(Q~XLvo&{8wl&u6-){Cv6PFf*v>{y;9cS+T(x;j)X*>vnb}PW z6W*=PXH9BN)3kJbVwied5#p8GivU)7i#lB^gjF4&*6&$L-T53(85k`tuqmTzOy{aza8+0 z&L|L$vH+bV%L;O50%}uW-2~+@x5Ajol7IHzQZjq5N=25ByTKyX4#e{}XpCaQEkH#gVB)U-o9L9(ec$CLo@ zN3ML1HgEO*F%Oquwb>io4~dwJ>+Lv0Z{o_wJ2Ky5D*dOE9eHa#tFOhl_aTru&yO}4 z&SV_-y)0kLnYRm_drJ#VU+i(LZJLG{O`cy~XVum=6H0$Q(e)?9k9f?3+gZgsVtjEl zqGf%cPC>n)wm>(9!1OG7xy>+IByji!N@S$lyEN1Qgv9A*Nt|gRJ|(niS2W4KDYUP2 z9f?wJExPntX9+Dbn@2scu~XV%`$<-cp%&-Wx_EIFue^Im6@R4YR4+>~pPrYOa1e#S zkWrtCB}n&#_CpRUW!0=d1%QNdVk_iWYJSnJ!~uEFj~>s%ARKz)>96Dn@yTok=wMO#oA^ZUpt%WX=4)FtP9>LU2CAAj9% z;^>$GQNJzn^e5xTfMN~RR4BtYci^Gp^1jLk(7s$OduDzQ5P?l0+hVDV@5{Q=W|o$a zD%iR*J?VKlIZeYaf9WW3p-D1Tx8B-{pli#SVy^jfx`(?Mr5y*C{Ek5C<*cz0aRlN(ZMz-pN!d~gfHP3_K=$-YZHd;h; z?4ELKRorr$9Sj_aqTLJIap$E=%OOst=a!P+VAt#v zQaPf#F>V}tdy=;?Dy3^ZRaIYPZf~C^svWFi-KPQQ;v9@B4&RDpjy`aT&S~D6s^V@E z%glkcwuLX1ewWTDn=Gu9SH#S`m@K4iPT21+=BY9=%KLh3JPH7%*ET}>PE!dT+o9m= zEo?cm(Q>IpwWrxgb2<*Nki@Q(SlOzBZ0dQqD*_eRsiN1?4XCJ?s$#dw$Tgx=#M6pW zUezf~ldF;qG(R#bc_`B6`pH}MQK||4oD@38RcD#f#>mYpwDI)sLEtpjSclS-U#8rq zrL0a5B_KdVZGKsA9Vnu4z487JC-Ku|J!9k98Qw~zMYa{**iXM5F6nhmk@MA}{eBH1 zH7?erE(%pgF5v<)O6j+BV~z75bM<;xPM369*t%3smm4r!(^3X%(KEOr1#;eKX++kR=F~Ed-fZ zsA0mUnx8{uCq?_s006c>1k~6lwZ6~$8_FPhN+DnkL;Xy$r&AM>A!=OVJ3_&|xqMGH zv#kxqoM%_Nq@nzHc{N~HRSv9_lv5}g$j{Z>*velx%MRRC$bVR{5!&L+C44NMiV*AZ8ZClNKdO z_z*_mdzCBiE>~{Iw@_0V6|xB!Vm;akl!@HDcGwM}GlUE@Eu|=%mm4Ueubjes0soJ< zY^&`bhMr?Awr^I5n6J`O&T}bN37OX#((wI||jCKBY#7A-+TM z%ikk79x0mH8gjXLrn%BtxzC2hjQ1&Tfxbm_b>76C%M#DZ&HZw3QLeO{jhSV3u9<$A zIhHYhQ~M`spO~{zWUg7opZb30=DGS=X6AA$%NI=0xI}cBIh7xY*N;zs|M*4lPrGCj zX@;&`_Xtj2USY1jUyd}iBd0Le2wG+?VfxoMOx+*V>Sw{N%%rnU!y88v1?-l|kJj!I z@0(dFJaetNG#J`-lc?RIt%ABHAuYF{mvc$^7XkAu6KYnbS$QR&Y<}*g_o3#wCWsJd zzu8-IG@fIMrpbc1i$XrFpA|=q3VJu7`{$8(ZZVtnv#$RZ#1L5!v#4Z&ELkP>Z_Wzw zRArwz)XX*PJOS?vmuBWtHdz}?zQ&eA@XG%qlIH&^1N2WWUf#!FCzc-W&t2#&ZPDI| zI=ynvreNzZ;L42bbir7^9{X&{omcwDh+Iw;kJ~I+K@VYVWDV_sPZnvc<*P<_X<&>( z7t6$(>JJhhp^si0Z1ZW}({{WPAJVv}&gc|NGo@^>CyBkI;qax1uJ>*QzHtzPOuc7* zlAVgbOCFogyNy6!tLADyeW*#mUfr0)387b)EIWj#u)kW(l&qS++HF^Au0afcLY=lK zuo>Htrd#`FJ*6K)NbE#{JLODd{`WdOcjUKn61Bc75#xHy}7v`er2Pwj1gFTYpB+GK)v@k zZoV?)_85JAI$k@3)jjYUWtxb#%&sM&2v&`zc86Q@S+8ly7VU50b<9e$jn~%Ufgm>i zL%{Cb{4})QFct$4G*4LBKi_r;o}K?9Z+dgJVTL>YHBsfi7n3~Z+%tx&^0)zvdtX?T z5TbR9D0fh6-%aWGVa}0QqR(w}^Kwn>?c)Igm|4c7U1pLKXF^ip-Zp=jD$c-DaS*^J zCMO9kFDgw${2$LOzGFE@*8rA)T3RADIsXOF?sRv`!J?d-JcyH*6iSa*{++w_d3@^ zKGD=sUMk0!GPRDT#xoFKQh_49ecT{dE+uAx` zC@YQ@wRcu*Gt65(yqcwBo8zlEtGn->NQCvGeq<;eUHQs0{MJM0k0P7B|D)XEk$_nd zVqubHH5=Sh#tg|pf1TYOi{y;ppKTs%>$1riSzGuNgVtBN7M}24t}vt z#_UOc*JTGsQzi%nuaSc8(-*`A?bgn_H4fsSvEdUl0 zO*(ez=k(C|rYc}C5eJd%vH6{%bFljxo2^Tg)?e>oF9*;K!@|M{d))6PdpUdpaGESm znSHgRbR=5yDd0k23jBb3Zb%JV>cx@LwL{c;X3?E5Ce^H0v)tD13F1h4q9XBh?pO~L z$Z#PK#TEgKX249Uq57c89_@wm@>R31#Bn)hROn4c29LuWhhpLC)vN#Bp4!^U?lI9< zc=vLNI$S&1u~r-hU{j`HX@Jm{dFk#kbidhgmC0^#pf{{h{VUl}GZ*EPX(zAV{{X%F z@NBZ*W}LzlUHvD5M8N{a%82qYKw!EV`N$GMAKH;02VYyswlktsy<^1*Bxjr3 z2rBUJaBmEYXW0c=@4tWo43~j+E|!$FXD1K?{nh>Eo$loBNlhjD@(SZ zrFy;??}|w-*I4DBKlyR3esVb(*@%6hmX+$9fW#iQzEL+u;ir%Zf=` zE>bRaJBGpQB@dV4P30}KI?r<#bS>hkyX)dv4+SIObC@U#8%#b~!7V&TCksLpW6eb0 zeDSDx0#838Uz$O*BbJ1}G`WaADPVP!?^^To9)VwLa!qpet!I~CeKcNoGWW3CHt-F? zTo|iiQ~o*!?HZ1vTd3W}`g1Ebc_A?Cy32Uih)j$2CMNCr8A1A|1~2y^sy4?vDZ%4e zqmW##sXc(6FHP;TY~VV>%1{0;1DAp&zF8nzn!G9o6M)2HwP?r1dqW0C@nQy;IjF)k zX<7kX&MGQ8lz=0GC`0V~{=niwhcOejkVknBKeY7XTNMa9AR3^;Ut(xETX*9qu<(sQ z!DfgD0nI^xqRVx(@ekVK0Ei-uBQd(^z!T(mDv~{6DzQLQ6M&p@{ZMqtK!gSSGhsX{ z(G~a?Dj&b_eeTA(Ta5NnBjTNiYY$>aVG~lL)Q3LEl2MgX_q)e?VFitVnStgEUEI4lJ!z2MCSvKSb4meYBZMRytyn)oWJ`5m}C^CBRS1x_$$2UrcB@^xAGOx(CnziGhv) z<8#bxB*>N08Jaj396Q0*o6<=@#5am`Xh3cqaInJG^m|ukIo5_#KxO*!1iDg!ds*$a z;pe_1O4o+#fC`tvk$}}dVrlPZjtI3Zx3+Y|oU&i-P!Pw3uhJaHQVFd%68sMLN$ zMqjX4=ULFHLPKCLk=GLIjhf zQ!?loyLCCU5Q29Zh%A48|AeqMo}H~1BMJrSNhRmT`=Ky}IMNR%Z;yg-WJI#N_VP<~ zU!aqs-ljVNzYG$B0Z?zTBfvCS6xOUw2t#p(doBC2!&tYv35)K_D7|tWjWf{nxuK%E z>%DDC7waOXfDNI1ejJI!jJG=LsA@;!6v4N3{@uwva*G=Xm=y)vOm7{Y>Md0U=06lJ zf&-P2B3=vRNPD(%Mk=srh$M=}jy*uS0Lmw*m*V3vc}qZu=a+TcB&qv2fQXrove9^7 zna6I8&ksS6Qq)~}xkt%+;JGB3(C40=1q$dL(cmlHz>fkQJqGJJ|4pSh;;_ zllN_gWaDY1F`juYT?>muB~=hV4E-HaM#h0hFaKjVr2;R)=bOrAtKTBul%-s7VS*PY~IBqw7%&IJ9#(QlD)tR z<46C{lf)r%6uRLGEX4RwbqKJXO4mQX1FW8n-&KdGOXxQi@B%x^C-m?pCq6d(%br%C zr5%#KOB4stokHdOTftMbv3~>B(9F(l~>l2+vdmM>j z5>s6;5q%!y7E@#Gcu26W5KCG?IgYJf>XUhSr;~=k{N)80eBoz15mE!I2@mOg>{*AA zfuW%xqH-3ddX=k#7xm#OY1G4U-G(%ZSZM!#uSBs$QH1mZmw z2r3s)bg;}+LJ7#R5;&A?g+WBw)J@*()f+{V0Ca!&VxFT5XkP{-BxY>NolYq_VZnva zJ|sRkOst@+@Oy5+^~#io?RuBJI_wFsBJAW&$BS#xcB16#moQ* zAod;xOSfVu*aO7txTWd-P4yo3&Wp~5C=fa}VF0xlRI#TJNrF}xiOLWFsdF$Z>OoVm zeAE1=`xxL3zzG%70(cwC(9fkNA&>mx4<5k8xB$l--(n!N2;v}433zb^=U49B+Q~b+ zTeeH3-UmWuXN(1L!Dy`{1Wku2U{q*L$UeKxdZSj^4Nl01A zi5UlV0U&kvs8BFY`rxm!T6tbLgs5M0q;n~11x<5% zbUDYM+wq^DYoRV7h8L*v9AS_CaxcVOBasWhdY)aW4|J&!NIxb2sShCjGtjmvhn}FQ zH&P!(gCJ#Xy|21SGDRGRd?L`WhfQrrNRz~&#Q@7dUhOH^0c4jPHZk6JhM|5YV{MR` z?`0IN6~=MSeOZ^J>^24>Gj+5n7R5&tNlH%ojNm(guksm(zUOHb`UcHHN|I?n?B>VU zcd`u<<*f-Vs)?&FKyn|4S_c&aaQ8!~Fktuzbit+o{YMeHdd zVTcA4pe6+>eISM*CcAc{zg7ar(6|Xvn~VtFEGTo(RUt=M_7<$jIIilG%n}wMr{%3y z5Z5cHZIGl)DHg+^I;JBH3im}S6cVv%HxCS^eGfA@?AXNO`CKWiowE#DC~jbP$P~Kc zlPF!dQaL`ZI2b+RBNb|nBRvn+^8?`TU7>Pm`k60Z(R&b*Qxarj6lYPPXaC}Q69k~x z!_mioMD+F6JzDp1v62kH0d|EwGd*O-LeTHUo4~YE+)RkknD`T=W-O@prBJ7h7E}yT zf$?q!>k8Vbw2g4o$)^NnD}WgTB^PR(XZ2z?x}hkf>wBWw8c4#GI8|87T^k1!mL5Ej zBTQ&k#JyJC50;G{4hVC!-I`P9x2HvAG$6eKtSlkD02|mJoMK#{8(1(}ki^kd(2_th zFu%z4^J74l!*ZcCtst`A1tO94%rcTE&WlTNhd-c<9<*52L+H&qAnRNETh~veU)GuA zJZm0_#Mu;JDM*b?YP-FxAX&fV}O}gzdEfO^P2j%1KgLnuOZr~hgLM8xY zEJ5l90-ln)4D8xq&r<#7bXpOn1Mi9?Qh7m8s%j=cwVHxZ9?JFi*prUDU?c6tPW@kP z+t+Q)KtDyJVR!xgX$m;3fSs=}o6!VVgfOEzmI%nE85VEKsd_MtFav7W?PEnEK~_kk zDb#9hHUPX;QoDL|gtY>%EzyZQaa>QKJ>lc617o#d3}TOn@qmj0OOOJ1bpCAqS~gxE zg{Q3R+wemf+eAwQZIT69P&JRLJD=??TLzAg`GWD#`U+`9sylEc->Sw7EIZ zw$%1gIcRR(1Vi~ChG&gDG_X^dU_)wzK&1>AA*R~((Az_smblZiNqt{rVmZKP(7G%g z)6~5B0Al{|Ner%l$vEnYd1dl|4^?~L-uSCF`xkrX{t0vXuYEf&3=;|#B0T7W45(j1 z2zy+zQebRB1xnYPd48Bx#Wo`BK{Zswma7Sv54A*IDrh$bRV-uTnrZOD=Rc5*2saPa z2@_$U#y<`xPEy>!_}3st)Ph>dD#yv87r{b=tpVmWgOZz|F$6VJHj&2#SloSiSsRpX zLme43zE)G~k@BK2wv%BQoWP16gCisA^Hq0)w0wupeU9mFV9miU9!CpBm+$?#?$WX?nc4WRVI zLP6VJ>ei;k50F4%#JO|(Yx5r=XHJ z+0$nBJGU5ZD}6mWF(UXGMQJr&2nxRnCT-ZbZdzK4e$%>Zm@h(gf2 zpZHyX3|xJ=C;UDPyJ}Echmocns>VSpEFB7-%mS|uEJZhoA&Dl013+EAKHcYc*C`y@ zPiV(UArL93a^?J04-W!Zl9+&r5LH%#atsV4j)Z)4P%axyb{8bB3FZTu#g5!lMl=Fv z%1zgHA_%R1?uah;Fv`_XM#kC)46354#|X?#RMl;X3py1aE=QhAR>{GABLY?}1ct#g zW*MywuEJHQElL2Rje+`01#}vR;0|qrz7H)YVvRt{;wxlmgDCX;ZM1?%1szXGz4ZFF z3%PoU3dk7h!>&Bb+q*@QtxH|ALY8L`o&yUDps@^3DE~J}&;PihNe3*RGcWXisA*0L zgK+@2JTsVhycKzI(lq?2;Nx)I9s>IZ*(TXw4@0%RH6RmMsmspLGJQbGI!o-nAZ8k@ zpY>75SFIpDCy>LYJtEW4IJ?0>t%4sX4FPgo2}<-xO`fixrvr)UpTi;`;smZ|xtf|0 z_~|ZMp2k{pr=kHKh&RFNP9uXI3r7N__y{=OX7G+Fdp9@WdrxHyVDGXw8IW`37ZtNi zjzT)Mo~h+=QPrFT>VIE_PsZ!rn)&;x5}X0R;z;1uG>Q@859}RL|D#R9xXy|ig zlM~GMB)WNw*8EwLGXxw&c%V)>M}fm;stj3opzH^prlKjo1|pUePV(G?qSTCcpV0iH zuR`z(cWq0r{;&a%(*TAhIaI(AjKD~-hZm{VBT3V1&Sd9eXpwZN8s07(4p z7Mmyalha<$-k&jyhPG><>ItxTBDUKFGPEJ0BeLYbgt{P+4Zhy+;t>EP4xW~yr|C@8 zB5@#kxFoRLWWq&zK>~ni8VfU4h?lEFK3De#UsBL$LKD~jtv5c1NO}xpSSkWJsKiF4 zGKlRumJUHKqF@Hf(s>HqM}ZrNDf(#O$hIFuH2v+yJeC0ZLur7x4$-iM_o$~iJvFvq zZ;lm*)_UMMC=x=!E1?l?f&wI%ei9+}dlcK>0Au%okU?>%d?xn29)49bdrKh`$Z

o|G?e8KIbfe;=M)uv*duntk)dFn$k z3aL6vK>?t6XmM9Y1i{bhlH&v2Q356hDI~p@?ud}Y$u( z3oMiX3#v=bJ%@aNLqG=UG6wd$5%+q6?NKfmk!9kZ)No)UOkp5Z~ z8-x*$g3vm-`IHBg*U?(@jrV}R*xcBFV!8`#nc&Jj3)^GUm;*Va1sxwyZasb&$g6&Q zQ~(&6jfD~p`Bcr-)3m@XRf8xNHq_{ww}AR)9)h7ZB5tKicO@=xE#9Eb;}bS%YncAT zH~S;_`#In?Yn4c}BSH1Ajy3{p5KeJh@Antb&PKGZyH)!@mO*0XrQ4T;T(J&;A8(;5 zzEx*^%2)-d+ZZl(^Yn-M@*$nOP%XFteed31KE00xoOAeCON!-o>nM0gg!i(cf|OYZ zM$zZv9kFy%Bdi3SGp3%n?u#7j$Q=saGV;60Fq^2#FUY`6=1r-B<~jsB95!lreDxVZ z@_&G{rD)}-F}%=>Ud+m-%MI}~& zy?=qJEP_WLs=j4q&kYggH9vAqZk}>>ced{3lRGS-@u%~)GxsIT)c1;f{;?=h{+0aW z%FjxFp7>E(N$KX}trlmbqT2N}k7ac`Z#8v28u)1BicLo|@ABl2%g+n!^9FgmLGpo} zuUX4lrQOQ4H1)Pp0nCX@|1d-SqvHMhDVoM_{~iq(g}>Lvp}!Zy-+N(`ul##2{Jj_c z&I|u6Ex!8c8K+|h3YsgCUz|ApAc20WE@2}a)$<&^Z!jMZ+1T2&x3~YehF;+n+mw6u zDshYzP?d~X33;}2&z>C-=RiEx1W##3r zSFRk<*4D-T;O18>pEa__+xj&TO0M~@yMK^7=iLv(T)ooj!6dzbaID;Gd#{zE(n_~H`J-jdX7 zueMXb2n7nq1LV&{Trc=^K~SQ5M&Y13xT1hG zKwdZS%&|r%^2n{gailLTEg=&FjszWMz`4$IdU|>!&P*UoHu7nrgX~dGR5(9Q1STXA zIT~!sJ)1y#CIHFKL=Kas+fB$b3#WgboC*-Z1o~bq*zA;nUoc*p(XuP|v3~; zCl%3tI$^51XmDcbRu$0OQXw%t;qy&Wh|M@mo$l!ANfbw{+}he&JN)fP+)%}}_xJaI ze^6Ms85wNgB#-3DlP8fVj85a}s^|b+4`;`}>jgbr&3oVh$Qv54EYMTZD99BCOSfOw zZ*}(?WNF}_9VBu17Qv|iS-wclz}mKi{)(2wJ2S(6z6auZB7SB-^4^b^v2=xwjL*!p zzI%5bCRy?F4De7X;^?fl-aW6u7pgcVP&I*jI}C>eTVO;w`udW=@FoRj94`$Gjqm^t zxau0=xK|RK5)!#q-CyBjOoCra*tcpHVYriFrAE z$8boYlrTuhB$E{oCj;9eHr7ZZXK(+Kpt`pmd_EO8GIdx6>rrLp+@AV3(b3U}qeHz8 z4hbp6GpN@C0+{g26HPFwoXQbIuy5P8O$km@q=Kgj{gMFs)r5T83V9s<(_JY^Tn&)l z_e3UBnC$vKBcL(s-M*Dos5Mu2v62U7k?s+0-xWOtm=V(y-VGBqB92#3$Sg8=m$2CkBN_oI#fq5$f0kk zYC}XJ__4qqaTJ|M+)2VKBec?*n^^>kvGiMS&CEBysp<4<}?}LqBQ~ zg#~K81(Y@jRj@8nky)OWAZI{I_3v{>F}9oRNVjT30TWnFH_%K_OORt}Xeb@jgG@!Y zSHEsYXOc^O221V{~m>th~#MOl@Vn&>3IkB<*f{BfYggrDNjhSG@qwhcbhnpZ=Mu;@y&0c#Z> z_*RVjszU-$#zCP4{9&7iMv>A9x}JW>dhKa3bRHu@cbXUW7f(q&lYRlcgrR=(*CC64 qJGl1`9`Em`XmGy%PmM+qkxx+kQjwvf)^F%bxYI_b3V*(M^M3)==$%FY literal 18798 zcmeHvcU03^`)3^6IJVbu#6c7s4KPYmsz}puECGQLh0uf2y9DWw;OOX#C}?QX9Tgcm zf|SsL4Gb+x??Fk3^b%SiB>UXVyt{kO@4RPse`U|^IrE1nV7}$v=RWr-pU>y=+fPPk zw|=$fD+~s+6?g7O6AWfO{P@NDFE_vkBdp&HKGyh}oc#fl*SvQGgV~S4{dn?HVDfl> zNOGIs@4}hI@dKZ~+PLY*olmAc4ktc)df<;kj~{=rvFMxhN^FppgDsa*H+ErXLq#nv z%FH%0NVV1e*Z6g(zv2FT=jrutYK;1gdmy>UZJHN5yFNEs$_;a+F3B1N* zd~R^4F4Ndmz~`}H92m?mm)iT*ihkk7dtU);PX+Yfqd-|rGGOQ>v-+mx)=w4fAr*o9f!aMa|kJi4|%a!zfyp70d>h znwn;1-6<|yo^4QK^an8eS>`JX6Y=7h-9qo@W&RUAj!B*+bTcc@Sn_Ho*)T%vm!;9L z0|EVhc-ye~b}X(ga^LzBFt+dSORpW6eLPs7x`_Mc@vF+Y7J~$3$9m#aettfq)mYDl z+W+nNalg?Rc!y4uo*>Z8&8;QFIL(wavB)Irg-jIV*$dYXvH{A}@6z-PpK2?@blEY0kavn99|@ zG9Pzm41Y=}nCiRMYA7}K9KLT3sOF{^AHQkLYB5l1N)z%q9+fk-uI*XvvZU(uo5gbC zd~y{8a~XPS)Ude^XE}d7iCq4Xp=n=xcZ;|(Rya=(#%|kpJoMF$FW`*@2hxsVNZ_Qd z3%@S#9`iyry7uO?&+J?@&ZA{V9==ChM zDe3p`9WUwivH;UZV^y4+8~r+MIvupfa!YL`L#JP!Pf}N4g41w6KZ!D%%+JiEXJ({Y zQp4)@1vt#I=&`-0Zf&7E>v9v)2NvriIrVb+jbr(=0oHTcO8?aCaFX{k0*%y7TA9$B zRjG!>QwdoZuUz^RA+8%5$X-hFu1+veq+;>bKBw7TAyZZHAD*1$yxmP`Y*3;l8>Jj~ zT$v~}j*`?dv9hw#oT^@#Y*?BZk}EaVnt0LY%g_lL&CHl>)|zsF;WiJxywRF@F~c#H z4F5Zfr!AY--W8ATE^^KYS)3Ht4!qi7$|lZx1HxSrzC~? zZ`b2rt-U7^Pmh-6R4on|czSxOGefz1!3eIf^(ZVftkp#(A*k>7+meYhLv_x`#?!C2 z`*u6VD=eyneE$7*Vrag9k84Jhn$|AlLAG*QN#2Hy%U0Ik#bLx4 zBjL!N<+$3xGk4z&Md_u&!U-GY@+&E4C4-*QHPO1jjrU=U zN7ioGa*k@<9E-Q5wkh|Z(N0!OH5+M7#Qc8hwo|`fXHy^5H|Z`1Hbhgjv91NR%I@XQ z+KYX@hP8f6A8$K@lb?tCb4v#j6I7gKw)#wO)LVLKG8JT6%YAn+>QZX{2e7dUiNEAQ zTV0Ubg$ZDWEn;yr(rQaKK0g_z7rRm$xi6`_y!;X#@4PVHEw1cvE;?M(Z?x_1J}q@U z9^IJOZi-I_tK%q4pnSD>F6Iq`_=N7TPEoxF2sD*76jmDdcnIO11pQA5Mi$g-G!%phHu^sSSQf6MBZSIf-Q9j!(-o~E} zySRlFW(Y<=VZ!&*Z?fvYkyDQQp*t+7VJ$dWwzJ-fMM)pAAw4x{z_wVsHdZx~9j~F<{yzMQb(h98CICgNt6|bNf0o0Se*oe?N8ca4eDAq=6PQcBLA2 zuG9NRCpAAmx^cK}q1!nvIdqop`r+~EdNy&gd@N6fu?i{bz(h}R!%UqNVUx9eU1SqM zxZLR&>4+w38!{0qreOKBq(pt6mcPf>n7SybG~23R$5%Hu8A^5@<9hjIA5YbqEIX)F zIsHTP@v)qGo@~lBljXUQix#8hS;zu1Yp#BJ^V^~LhS>hA(X6GRD8|RzQmNpu!%0lO zleCBK%$uDJTf!@*szWwx-4ny)4{I2H8lW`9OYFN^vxZknUMcMZe==0RJp$XIS(B4o z$)9bY4kx-Fu9MK~)$|>9n5tSd+T#=<8PMlrQDAp+!?wNVn`(`9=G&Cl+ELK9@Aj&g zP!5>v%b^LD4f@GEcD%-KsW3qcNT@~ZP>RT~fB2k=ifVxvY;26-zwrK|P(DQ~Ag}RE zl6DXg+3woZfR2?H)e({;&Exr7u~_k|Y$BCzZ&mCTyH&kwzw5&t>hO;Gu-lTsE-2t& z>7}&Q3F~VgPRFjGTzGAyC7tf;3Aa+m3mZ%zv1%@KGe{-$@iItursVeJ!N0U{s<^_4M)v+b8TMh^hg! zBtwmURd7bPuQAR|iN%fFjoT%YAv3Wgm`i7(F@e)BH*yRJ%O)i~ZrL(x3T9L!j$O5* zu$0I=16!y+_)Os{!HJRD?@;pj)Ac|fn9S#|;%A#59(_WmeDo%-^mcoe_Q!?jBAeA8 zX36Z2V7xPU{q-Qk{D5>RA$Yi)vEJ%6X+BC!PtM${|Kq|FWsk0cwvLWrC?SlY9>6bY z-%Gl!y4=Un#q%nBZrnKodC>AOhQyX5xPC2c`9~u-P&8~NP1i4DP%Pjw^az?6_>GZMj#pTS7z2 zwe6T(epc3DH8nNEE3TCDX}UV`)K4>(nGt%P?UtLx=PspR<%D<#*iM?;$l zOF!tRw)r{-PB69b}TFcXcIh?QXHQV~~f9@@=aU$4OgY$T_QK zFL-s3F6E+cLdGk7Wm+s(5fkY6jWUMxHJ8K4x8{0gr1jU?(XibR9}w%Tm{sG zNqw}TNG(OKkGq?;+$=b^0$LnYkD)Tk(5c-MN)!}cM7|X@0vX$}j){wwL1A5=YHd60 z#}!;a&V?0h-Fxf^3KgScW84*{kd%3j?}G|i`YoB=HrFnAm5)4g^cqIBR8Cb~=^dZx z!IyG=1EbaIk1%C7M@L8bb!7foc8@QtDau-wB_7?Z%GwjfEcq&*p<2hmn(HIIrQX~0 z_|xMBueZfY=SIsKH>1d-?%5;n*Hq0Q3%Eg0li-7s!|6In^ag|RJi~Rh~tJD9r*ku%Ie~fg(=>~&(!hEC#W>z z)1Z*mgm0p6F+yjgo9_*|RnjzbDkjTOz=2-m;nT~$l(zx)w)^0%+#6E-{b%?3{K)Qt zz9J3clV|aI3z)*7RECcX^K5a^+xYeQn||qA=YTWt`s01s^V-=+^6D6Y0a>uy8X})T z(_|0a3L{mq>-Ur1R+=UPVpn?uA>*KA=gzVq7t;En0G(#TC1EDnbIX7nQ$dLy;&+M6Z;> zAh$@U%a=j|GU?pZ2f@jgKU1f)SbnoXVrW*ER?EfD@nBD76mQ*(o#bm-uozM zD|8*Gog6(*f{zB&@i~+*|9i{l@x^RZTe;tu2bCQs7bZBn{&(qsN*hzCKhHxnh!0{u zI(fs4$I~4N>_FSeqomuZN#`!x4R&u&sW-FlHM|7VaYe2oIRI5y$(W@>7ZsIsE*BZZ zD^dr4-rNH5#7TT7x+-Feq;_CtKPleXuX)yLhe5cW;{aK>iWVN)CsW;(ZpJfTPII?w zMoL^y`nTwo0~oZkPdv}vSAh}<6mvH*U!u?TGJk$^eN#C4^(VV8_M^{l9{&5jR(NKd zHqeK*8%*ZD7@MexGqL5n1O;WBx*nS-pkDp>>V?a5BmMMUI_ULw6CGEo=7rLm$3{)? z__XC^A{0vXU+ovN>T$X`*#^||0-L1eartot_@tOX zVvi+;h1KK448Qtj4Ubb|NAk10gwMESs&DH0K`#~Sv<^+)J@a(*Lw%gSscFOkJ5y83 z7k}g#nP$c;XTdv9hx{Br$+KW|rmL)RU(o^SEc$dR#ahdsyem zX}|f$d(0K%lN$N07@jlU#x!=+#1zJ1Vq=QJ^dsO46Gesc zNy4f5ox=T@dA1%+p|8t%S*L};i6Jg%Y7Lhx$D>SMJ8e+N(oc^uz-4*_tTnebef^l1 zbtxTEscHJ@BFBq|c^RSzy}E};h=|cY6f41fL?!=p;qYo0hxwK?zV6Q?r5{UB(6_ka zwg0}Vz}?)VDs(7HJRDw9lYuk!-Hu*|G57s1g=PL9cz8kaaZGapmo(h8@`!pHK~b1A zOLsp^W#DHvb%;!E|8vWQ8|T7>CVPi$0}sK!O!@?8cg5H_rEN6HI-K6SKro{8Ehg>A%+7AW@9}2p9hje=kL^XTaDQTKKlFW5njWpM?}m9F zPpGN7(>6#AHycl@jK)Hvwhc!StSr)Z+}_ud{CdcKdGPi2XzW;t+x%iLo7iC!(C;{4 zE76#&sgmiH5I6SX9XR<#a5CgUhtu2oZmfluB)-jf?vvxEf(cn%b}M0eC1L5i@Iow( z*!Ac}G}fkin&-4nLW(e?cPF-LD_mcozO1SqS*(beEOC#jXBz8qt*gyf^2Ohig--iK zAtltZdmRF_FkgA(Caoze%dPNAV0cwt@ZFByhtVzWC^tM|=XrT2g7_YNDZd8U=Km7J z_b+_OeFm2{_;a=}VE*npvm&mMb{X|H8teOUT_4POinmmyb5?eiiH%JxgxgE_SQI8q zGGk0As)Ac;kCL$vXmAj1pdRv_U`V-4UPdmGv&+l?BOfcao;G?bO|0D%pdknthtgXf z&*AkC9p0a9qiGQ%*fT`XoR=o3A{(5^md2RH>c@WB_1H(u&aeIPkm_t4M0-5W*i&`^AUafK2-TbS{t}Qhb>6)CA_YBAl=|uf`_MebtjiqDpx|*2T z#rJqq{q|2M3+5IbYYLvlG_c#^8*rl+6<4a!FjXyeR4}`3J}RY~yk_1r_*u>%e7B9z zIPS8aoQ8mKC^O5r{$~}q?!?Y)=M8o@^w(L3p0U&Cg+%ReGOyA@u|WTu_-~>#MzBH?hHTTGu92w=UYtxpSe#+x1oX>PD1wDApCBI$kL6Au zJm@>rRQl9fQDgC^xNM6r?BW$|X2%G^i6D4H zeuv^_%~v{e@7`H!&)w-;&=V%P=LttFCDtTKV-Ns#AI?e{?)hO5p|*zV-A^@diIT6}wZS#3EdrH^mO{sd(6RS73XLMf znslBzy2WA4p)3`wt~j^-alxYO>Scr|&W*Inu1wL$x3){AVo}$S1Q%%3O{3*_bR^Mp z_n>arGV6JrWCNgA2?)M}4z3&EPG#4Yr`oG?tvoMrdkul6!c2n1%|Da&V0N%3WMk|9`}V)fD|=$#c^p*cd(_qFk^qtH8hQJy+8Qk&GY z(NoNS_a<{H5;Wb-DDd(+7M{jGef*jWlr)z5MeA#tQ?#4`Az?uANr_OZK87;^$Yk*P z#$lRZjD`T`wzf9aPSGUnewnOVDH)c0rSDoIU4v`MC(y9;fsiR1%@T(03U;f(P2{fO z#?LHDWvBp3_#$9IbD=mtOaYLA?pjd(&-%v9<%Z)hlI&m-rkuL>T6wG>66vTuA-OUBbCYp!hA@w#~+3NnI zW<)hPf;=TMg9Gf`*-v^9SJ-b!885oDb6Z9OHOLbcsKD^MCnW$JI^;_tS|8s z-_VwqZ+&$!%UD1C)?7wo!7@aL9Pg!p*j*>!y6`*gDr*ap^+PlB^Nnq6hR)MW>eEdq zCi*hM=eJ@co?+r3B(%q0#N%PXkZ+s2=RCuhdp(@Tr2|- zl+Er_T`LOSAKW&F&qH8}9lhxGa221Ylzz!H&BT$HzwTY4iC|@3c5Ju8dK9nh9<&1h zWw_M(7zHEKLlFX7ZN4ix$Ms%AxWo_p;R;Md=qF59c3r&gr@K*EWT{>5f&|I@m^{U* zVBk$op)1VgVul%M-sRuOziv!Wi5`t}r5Z)#v_3xGZfcrosruG53mI5fEh{kuU5=?q zJouklkbbcrJ@uO|ODPN!n4Uhs(|HgvdiqXTOh99t^5EdvVdxJUp~oqDyPV!yL1#3Aeuba(zSPQ~+(oCV1}i188QB;${Kq zABL#a08lD^lnQ82tZZ7Sa*dmZ1I6EL9#U_l^9`}6qi&moswNC5kebB3_MF!6&0xtXPd;-NjN=F@VaTbxW@*#>8 z1HnWuWRmKPf^HCZm>o~!JKoy1FVQU5(h(5smD`aL@Y-0K>uL9lW5)V@HMnrK1Ui4{Gs6crdiXx=VvMu=Ik3}eE8wdhr1epL*MgjDd1x@N zW(bJV@cmQU=q!3Pw`wX(2@LNtd)ztM=L~Yie=-`t)*xtFztVt$fE>V%M|z6Kl zE`t+u(TEOAi%Q`1Ai@(7hyZ9AG-}JCyas|1@JkeIe?``|OGzzbPNA02?fqRSyW=o=JXW;k$D2Fjj#oeKCpEB%XYPLcAZ)Q;6VOY7Qd&>ZHh_&BuoBLe_NPqy!i-QgvE^T{82yY4=Yp z0DOhTRnNxeV{r&!9tVdB67V<|0Ve@yaTs7!eYi{RcVB?x7!QxyD-jzoc2rH$lt%ary!;&q^YQ0-(AhIZMGaMV(%rBKGWXT~CQ;5{e}4ctX?9>o*^+gPLkeCaNE7+5%p#4ageq zwI2^XYa9q&gj&Z1=fY&2M%yxDn+*1B{r1Ry94doi`8NfEWmrxIPBtZ`r>E!cUQJ~L zfG#gir2#7@jVlDV%m55hiN+_k6hzPJu8c>g`1fQMHu8|=pyX@;y0Cr-QRjO6kK1{# zr3Ck3+nF^RoH{=an?PESe%Z_sV0XDvS>x17{V9~;9-Z@Ndd7Pc`E`a?bDwoPPw5nS zWt)j=y%O6{-L+Bvlm(b6MA4e$)wxlkCB~eWbF-9{% zH!S#{)L9TMY0d z*OWbl@{j|Wpb0`k8qf}U07)|dIgLf64mD~7f)9A-2iBfo++m5E^19ic77MWUC=eqQ z4)K|h`?Q9EU};fi^aC|O!9t{PA@Xl**L?@jq}&G|$4W?}397CpP>2vTI{-)9OIrHa z4M|o7h{}4k6@SPt2&x~di(P{yFGGoLTQ40DWbE5P@CQUJx6~uZ>VH zJUPP#3LWtaa`{D1VJgpnK@0+Ugj|DLH0w9nR2SvA*qIEy)kA2ZBm)Ppr%xuSI2%FC znNrQS~l$Hrp(h zIFcU!%rx5!d2}nF^IN2JwJqes)oOEly($zoi^-n@Zl!Q6ui_b?oSIXWTw>dWv*`d% z2SHv1u}X|JP}g$vJ*&&}4aJ?dNm$g)m<3LPcST1imVb}Z{{nbVC1eETvE}{~iLh5) z)0tCH%doFa_G!Yynoza`fZFlp&+CIA?Wur~_g;H{GWH)-P!psBR2np#;7siEsgvH? zdA<*dBvDfdC84kMHFc6CVk1DSG6nlg9r4-^KEA%qffCDrf}SD{+8`rc9&0c0-FJu$ z^#TA`W@u&HSuY8Enw-u=b>oQ#$^5DzF7P44QRHBqc!K{2<;4hd2~{gV8}#M0t65W6 z*X}~cJm}8&)3@~+p&?DeqOPkMDhpInxt4VdKo^-J0bzBwZQ$h+CTRu1)zsN~Iqr~@ z@K~o!fK5xmoB5og<}B;oQ%_KNghVjM116J|LO*Vn(*~HiIzhwR7Nz_8W3=V={9(wT z`9GF9R?(z^9cAB=@OlSIB?_oL)S$p|XIH=8rX>%Jphq+}0HhkAvna+nj00;!0=7Y; z`*|7Egw#)W z02ZUd(DqH&)dTy4KL*Obx!XClr|%24e+EqAocYdtXb;twM~ zB+AmqWyY|btx~7eoo9rW^p6vTC{_I%)i?wq9F`VXqad*cuW(g53 zz}7QRy*4aa@1_B^MfnwK3ulP2DSyfG*0;&8xmpvx2GJUELCh)AVg>SWrRt?C6c+e+ z6L4Zk&XnKg%K#;pu`bU6L`TJzb(Q7qot+%u*_u!Rz2o2+`G88)Glj2NtL)sIoIV)> zWlmBkQb=M7o1K0coO!90`Rq#&~z2IAN$nq z4PqLUSR;YOJODlh-}(LvdyOnf)%MO3aYq}P7XT99u_rz zURMgz4(gj2dcsh4B`l;fG;cwG)yUP6R(hF8A;ars3gVC)5}w`&{Sp3{B(hCnC-mu@ zrlfcfHnCoB*E>(y0y0X(`?kV@B@^opfsVx}5|T4g*I9WMn<9&0QMrs%A~_JW5Lkvp zE2yS~M#deH$LCYEHJK{|i^`W@-IU4qtrd5E3LOUG0o6h3f*KnrZ?fK0V8u1OtPyhz zHKn3&BO1SvCOZbn%RsPb1W6bL_hhnw2dE4KWfiqcCc`OgP=i}wd$tF&^0y39J;71 zDg_|-9G{{INvK9+jb`UJLot%96gFZYx61q)EEZ0#6ltnO@DliOp1B~94aduQ9BH^Cl`TfI3g0Qyg#+Q zX&2u5fvA(+1FA8*YT@b>-fIzHNF)VCeK!(7;!f?&&dkIuPWH!ZHbZM5kCa(pgr7Er zK(8!n51en zu3c_TLrDth))J2STybhn7NsD7u44ZPhVluRSY4>lm+MHPe3KK@B!&rqUCdvq)3Y7r zz`|R7970WpNUt%*L+URo;4S#2hv0`#p{_JoUjbk>7B>s>Pt!;RYWF#q8|st5d*vat zzC%(|XtES{z2Bo|>+KCll_#+h#-0gcR|uBXub$_fOH%hF!hVzwI5dsS#t57AHP|=R zN9CGS98luvq7h-~QiAE*r~-#Z#b|1v3U#VbMRg-M1gjNiMVr z)=Ud(zNRvtAp}Nb!2dQ>E%cv}@QlHt%cF;+LZ?r{qFMbGDTN1!gIKd>BMT@1TQ~e5 zbd2e?8aOa+b>oq;GE_>VDh;g))VEGh#~Vk8DYU>IMrz_9sDBG5N_wG6QBP2FH$#m( zDn2r|f~+3^pNi0|F9yfEi;#TO0b11&zfFxxc%JH=6i{>wqm!LDXaN8LR+3Xl{3y}A|KxI0L*eG-) zCMMPo%gPmkuxc0@Nkaj;wm!0AUQe8SVB$U3q6@LL=Mr$cJIh};njZ}iEd$Q$3efNh~O;*R3W`m zHy|x|w@Sz&MtkD+lRs`In17^(tt>PFkCfO+AnTx4fCMHE#WNlNx0ez;%W@V=52K_U zIwZk#ncaI&Yinm)8|$_n|1v^w8KJ`})X}W$7TBIqq0P0wmP25E3Y{44HDwt51-n&c zOY4z_nNJZ)&CtI3LK{!YnL!})bkv1JJu-<(-8kce1jL|fGwv<%j1M9Mz6-h-^Gz1_ zkUR$P;&kxp?785bvPO*$&Ppb<8fl4;I{dN^;^Pp01v2OSma#CCdll;tV(LDw28=5@ zNRbZHgWnQc|1BwybyzyxMAxDd{_6`59_;vLUxD&**BG;&>xYVEBpxaoyxhF+Y-^&EV7Jw7 zYMtkV<%B>uMXIvwN#WHNXmg`^JgCo#F4j zfD!3s{tk?P?}fkj!oS)J$9|0?2P3%#hWr5Y<;K?8q%XS)nMiFAF8uO~{d<3OH!!fY zwEPjFE`xezaJI$jmT=@Wx&cFuiu?HS@}CFc?-19Cr1@X{rIY;U`S}0%ukxQBa4?un z|3H5i;L(5HV;>bfTUP@_w-azM-9SAGk2%vR(g<%wS{0{CX*9#>jjDbd2jM8iwm>q7 z3`Qm=jVN2TZ`a@|h@^WrT=X#>-rmNP9P{U&!mm#OkSA!EnhE(hogaz1&l9I7nu34t z=;+w8b!&P?hAcwRNcM90JncayAIK_@GvEuo`pbcX(n8I4UfHKR0378Vb>_{oEvQ7t z<&_l`5M;sm;)8%}j7Uimirq}(lnAN7D`#Y9%fYc7IvfpY?dSk8#@@Y+K(TV+c(Q|? z-F`#_pu^43Z7V|89X3Sf!68j9fbAJDl9ZGbbgn3`d^GEtzrXsJ=-By*R<(&Qrx8~d z85z0b`4m9P??3^t7(v7-tE$EzoD6z@`kUW&ssQ-|hw{DyaHt*#YYG;%$lw}rNUMZ^ z0d(RT(Gh?>y_DJ`1S#1p04eEDo*YC+m=WO#ATH;Z-L@_{LkNcf)ye&%_O&dEfg*ij zqPHk;=F^rfTO0s|1%bIhAaD8NdkJ-qcR+nA0|gI%AVCHlAij0$R^t4ZXel0zB$li# zNKcnWWFlhy$NQ)%2of(0SR}wHG(fmgcgdNl4wHe|?=JJP&jY;^qGNFsBuqdjuMnjp z(r$rLsC8f<6>+*aWtcEh_KbY~e2&80=k4vyfTOK(02NmHoaX_1!2k$^2t z_#IGX2N##`5fTWJCgJVc48x>2xxBIifQr?_;XW=ffzIF-@T)#06o5VYz}2q6{kgd- zHnKPv2ZaR~j#th+0I3EPkG`_!2~kL2iAl_I)xt!x0MM$xxoKx1kzJ2i!v6k#@jZL$ z0VF!pxC&fFG!~8ke*X12NHJt^!@zjJd0z)O7mO@oX=R1Z-Lin#HavT_ZYoj;98nO! zX+;3*t<4L7qn0=d=wz=MwSjlM+>-4Jb|PMNO3(3cl)s^R z7nQKWb8~Y~;c1*?Un4J&yP=craLaQ441vUxUR_<)9J;GQ{BU|V8&;$NR1!Ub6JhQy zo}Nue2H2FO;T#xvtg5Oi2*k)|bNm3)f(3EQDay@NNDEuAfb)zLthl74%(Y4YnYiMTA1FR9^%XOyB*+w6^;U2uawCB;{nx@i`cEy3?MENcRs7A&?1D* znmvwu`O3y-C-vUq`}GnilEZcefpYJmLYRQy9vdy(_6BqIp1y z(cX2rtGzuI@%-q)@W%_@oA;tqvP*YgVG;dR4XdFI!g2&CAJ@_2(kRG~I+6}|}Eok1ZS$vdB*EPWgPq{A8x z;QL48d#D3}`iI2?nJ0(7-Ra={OK_N2W9C zHg4F^($S%Q;LK!qku1nI&mdeLWG-rxdH@>pAb}vxXkxKD99IZL*p_YEoB%lAXnhu7 z^r2vg1_}xaE4d>yhA3IlF1AKtgyItu69=n<7E1y87ql#0zhbj6`KGtv@+m-%tF8qE zI0JJwGBMEv7(Wq?JVyOW?ylfY*^MpbhMm2)T^)gt7=e*cOba8#0b$#WG7btYK*4G* ze}19@Y6xq;c2iexVd>{5=;G;&RoeD&^wUq>?^LqT4=2R`!nyuBt#|qFU%@Kh{2y6k aLFr1S$u2P)LOZf3?zGX5c|X|w{NDf!<~N%F diff --git a/screenshots/settings.png b/screenshots/settings.png index dfc69bc4b62857e71f34bad52c69abbe81fb1fde..6cb46c73f09f9adbe03a41e00af99a845614d202 100644 GIT binary patch literal 51619 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%0Df+BAF&zrLVagbTu?y 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�m|Ei3xlpfTykTfX8rFq* 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 Date: Sun, 7 Jan 2024 17:01:03 +0200 Subject: [PATCH 5/5] Name action --- .github/workflows/run-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index b79bba6..232459e 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -34,7 +34,8 @@ jobs: - run: npm install - run: npm install parcel-bundler - run: npx playwright install - - run: | + - name: Run tests + run: | nohup parcel index.html > server.log 2>&1 & # Run server in the background # nohup npm run server > server.log 2>&1 &