{"version":3,"file":"routing-94838fa1.js","sources":["../../node_modules/vue-demi/lib/index.mjs","../../node_modules/pinia/dist/pinia.mjs","../../src/store/lskeys.ts","../../locale/en_US.ts","../../locale/manifest.ts","../../src/i18n/index.ts","../../src/store/main.ts","../../src/router/admin.route.ts","../../src/router/auth.route.ts","../../src/router/callback.route.ts","../../src/router/emote-sets.route.ts","../../src/router/emotes.route.ts","../../src/router/help.route.ts","../../src/router/home.route.ts","../../src/router/legal.route.ts","../../src/router/store.route.ts","../../src/apollo/query/cosmetics.query.ts","../../src/structures/Common.ts","../../src/structures/Role.ts","../../src/structures/util/BitField.ts","../../src/structures/User.ts","../../node_modules/@vueuse/shared/index.mjs","../../node_modules/@vueuse/core/index.mjs","../../src/store/modal.ts","../../src/components/modal/ModalBase.vue","../../src/components/modal/ModalError.vue","../../node_modules/ua-parser-js/src/ua-parser.js","../../src/store/actor.ts","../../src/router/users.route.ts","../../src/router/router.ts"],"sourcesContent":["import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n if (Array.isArray(target)) {\n target.length = Math.max(target.length, key)\n target.splice(key, 1, val)\n return val\n }\n target[key] = val\n return val\n}\n\nexport function del(target, key) {\n if (Array.isArray(target)) {\n target.splice(key, 1)\n return\n }\n delete target[key]\n}\n\nexport * from 'vue'\nexport {\n Vue,\n Vue2,\n isVue2,\n isVue3,\n install,\n}\n","/*!\n * pinia v2.0.29\n * (c) 2023 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, toRaw, watch, unref, markRaw, effectScope, ref, isVue2, isRef, isReactive, set, getCurrentScope, onScopeDispose, reactive, toRef, del, nextTick, computed, toRefs } from 'vue-demi';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\n/**\r\n * setActivePinia must be called to handle SSR at the top of functions like\r\n * `fetch`, `setup`, `serverPrefetch` and others\r\n */\r\nlet activePinia;\r\n/**\r\n * Sets or unsets the active pinia. Used in SSR and internally when calling\r\n * actions and getters\r\n *\r\n * @param pinia - Pinia instance\r\n */\r\nconst setActivePinia = (pinia) => (activePinia = pinia);\r\n/**\r\n * Get the currently active pinia if there is any.\r\n */\r\nconst getActivePinia = () => (getCurrentInstance() && inject(piniaSymbol)) || activePinia;\r\nconst piniaSymbol = ((process.env.NODE_ENV !== 'production') ? Symbol('pinia') : /* istanbul ignore next */ Symbol());\n\nfunction isPlainObject(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\no) {\r\n return (o &&\r\n typeof o === 'object' &&\r\n Object.prototype.toString.call(o) === '[object Object]' &&\r\n typeof o.toJSON !== 'function');\r\n}\r\n// type DeepReadonly = { readonly [P in keyof T]: DeepReadonly }\r\n// TODO: can we change these to numbers?\r\n/**\r\n * Possible types for SubscriptionCallback\r\n */\r\nvar MutationType;\r\n(function (MutationType) {\r\n /**\r\n * Direct mutation of the state:\r\n *\r\n * - `store.name = 'new name'`\r\n * - `store.$state.name = 'new name'`\r\n * - `store.list.push('new item')`\r\n */\r\n MutationType[\"direct\"] = \"direct\";\r\n /**\r\n * Mutated the state with `$patch` and an object\r\n *\r\n * - `store.$patch({ name: 'newName' })`\r\n */\r\n MutationType[\"patchObject\"] = \"patch object\";\r\n /**\r\n * Mutated the state with `$patch` and a function\r\n *\r\n * - `store.$patch(state => state.name = 'newName')`\r\n */\r\n MutationType[\"patchFunction\"] = \"patch function\";\r\n // maybe reset? for $state = {} and $reset\r\n})(MutationType || (MutationType = {}));\n\nconst IS_CLIENT = typeof window !== 'undefined';\r\n/**\r\n * Should we add the devtools plugins.\r\n * - only if dev mode or forced through the prod devtools flag\r\n * - not in test\r\n * - only if window exists (could change in the future)\r\n */\r\nconst USE_DEVTOOLS = ((process.env.NODE_ENV !== 'production') || (typeof __VUE_PROD_DEVTOOLS__ !== 'undefined' && __VUE_PROD_DEVTOOLS__)) && !(process.env.NODE_ENV === 'test') && IS_CLIENT;\n\n/*\r\n * FileSaver.js A saveAs() FileSaver implementation.\r\n *\r\n * Originally by Eli Grey, adapted as an ESM module by Eduardo San Martin\r\n * Morote.\r\n *\r\n * License : MIT\r\n */\r\n// The one and only way of getting global scope in all environments\r\n// https://stackoverflow.com/q/3277182/1008999\r\nconst _global = /*#__PURE__*/ (() => typeof window === 'object' && window.window === window\r\n ? window\r\n : typeof self === 'object' && self.self === self\r\n ? self\r\n : typeof global === 'object' && global.global === global\r\n ? global\r\n : typeof globalThis === 'object'\r\n ? globalThis\r\n : { HTMLElement: null })();\r\nfunction bom(blob, { autoBom = false } = {}) {\r\n // prepend BOM for UTF-8 XML and text/* types (including HTML)\r\n // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\r\n if (autoBom &&\r\n /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\r\n return new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type });\r\n }\r\n return blob;\r\n}\r\nfunction download(url, name, opts) {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('GET', url);\r\n xhr.responseType = 'blob';\r\n xhr.onload = function () {\r\n saveAs(xhr.response, name, opts);\r\n };\r\n xhr.onerror = function () {\r\n console.error('could not download file');\r\n };\r\n xhr.send();\r\n}\r\nfunction corsEnabled(url) {\r\n const xhr = new XMLHttpRequest();\r\n // use sync to avoid popup blocker\r\n xhr.open('HEAD', url, false);\r\n try {\r\n xhr.send();\r\n }\r\n catch (e) { }\r\n return xhr.status >= 200 && xhr.status <= 299;\r\n}\r\n// `a.click()` doesn't work for all browsers (#465)\r\nfunction click(node) {\r\n try {\r\n node.dispatchEvent(new MouseEvent('click'));\r\n }\r\n catch (e) {\r\n const evt = document.createEvent('MouseEvents');\r\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\r\n node.dispatchEvent(evt);\r\n }\r\n}\r\nconst _navigator = \r\n typeof navigator === 'object' ? navigator : { userAgent: '' };\r\n// Detect WebView inside a native macOS app by ruling out all browsers\r\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\r\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\r\nconst isMacOSWebView = /*#__PURE__*/ (() => /Macintosh/.test(_navigator.userAgent) &&\r\n /AppleWebKit/.test(_navigator.userAgent) &&\r\n !/Safari/.test(_navigator.userAgent))();\r\nconst saveAs = !IS_CLIENT\r\n ? () => { } // noop\r\n : // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program\r\n typeof HTMLAnchorElement !== 'undefined' &&\r\n 'download' in HTMLAnchorElement.prototype &&\r\n !isMacOSWebView\r\n ? downloadSaveAs\r\n : // Use msSaveOrOpenBlob as a second approach\r\n 'msSaveOrOpenBlob' in _navigator\r\n ? msSaveAs\r\n : // Fallback to using FileReader and a popup\r\n fileSaverSaveAs;\r\nfunction downloadSaveAs(blob, name = 'download', opts) {\r\n const a = document.createElement('a');\r\n a.download = name;\r\n a.rel = 'noopener'; // tabnabbing\r\n // TODO: detect chrome extensions & packaged apps\r\n // a.target = '_blank'\r\n if (typeof blob === 'string') {\r\n // Support regular links\r\n a.href = blob;\r\n if (a.origin !== location.origin) {\r\n if (corsEnabled(a.href)) {\r\n download(blob, name, opts);\r\n }\r\n else {\r\n a.target = '_blank';\r\n click(a);\r\n }\r\n }\r\n else {\r\n click(a);\r\n }\r\n }\r\n else {\r\n // Support blobs\r\n a.href = URL.createObjectURL(blob);\r\n setTimeout(function () {\r\n URL.revokeObjectURL(a.href);\r\n }, 4e4); // 40s\r\n setTimeout(function () {\r\n click(a);\r\n }, 0);\r\n }\r\n}\r\nfunction msSaveAs(blob, name = 'download', opts) {\r\n if (typeof blob === 'string') {\r\n if (corsEnabled(blob)) {\r\n download(blob, name, opts);\r\n }\r\n else {\r\n const a = document.createElement('a');\r\n a.href = blob;\r\n a.target = '_blank';\r\n setTimeout(function () {\r\n click(a);\r\n });\r\n }\r\n }\r\n else {\r\n // @ts-ignore: works on windows\r\n navigator.msSaveOrOpenBlob(bom(blob, opts), name);\r\n }\r\n}\r\nfunction fileSaverSaveAs(blob, name, opts, popup) {\r\n // Open a popup immediately do go around popup blocker\r\n // Mostly only available on user interaction and the fileReader is async so...\r\n popup = popup || open('', '_blank');\r\n if (popup) {\r\n popup.document.title = popup.document.body.innerText = 'downloading...';\r\n }\r\n if (typeof blob === 'string')\r\n return download(blob, name, opts);\r\n const force = blob.type === 'application/octet-stream';\r\n const isSafari = /constructor/i.test(String(_global.HTMLElement)) || 'safari' in _global;\r\n const isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\r\n if ((isChromeIOS || (force && isSafari) || isMacOSWebView) &&\r\n typeof FileReader !== 'undefined') {\r\n // Safari doesn't allow downloading of blob URLs\r\n const reader = new FileReader();\r\n reader.onloadend = function () {\r\n let url = reader.result;\r\n if (typeof url !== 'string') {\r\n popup = null;\r\n throw new Error('Wrong reader.result type');\r\n }\r\n url = isChromeIOS\r\n ? url\r\n : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\r\n if (popup) {\r\n popup.location.href = url;\r\n }\r\n else {\r\n location.assign(url);\r\n }\r\n popup = null; // reverse-tabnabbing #460\r\n };\r\n reader.readAsDataURL(blob);\r\n }\r\n else {\r\n const url = URL.createObjectURL(blob);\r\n if (popup)\r\n popup.location.assign(url);\r\n else\r\n location.href = url;\r\n popup = null; // reverse-tabnabbing #460\r\n setTimeout(function () {\r\n URL.revokeObjectURL(url);\r\n }, 4e4); // 40s\r\n }\r\n}\n\n/**\r\n * Shows a toast or console.log\r\n *\r\n * @param message - message to log\r\n * @param type - different color of the tooltip\r\n */\r\nfunction toastMessage(message, type) {\r\n const piniaMessage = '🍍 ' + message;\r\n if (typeof __VUE_DEVTOOLS_TOAST__ === 'function') {\r\n __VUE_DEVTOOLS_TOAST__(piniaMessage, type);\r\n }\r\n else if (type === 'error') {\r\n console.error(piniaMessage);\r\n }\r\n else if (type === 'warn') {\r\n console.warn(piniaMessage);\r\n }\r\n else {\r\n console.log(piniaMessage);\r\n }\r\n}\r\nfunction isPinia(o) {\r\n return '_a' in o && 'install' in o;\r\n}\n\nfunction checkClipboardAccess() {\r\n if (!('clipboard' in navigator)) {\r\n toastMessage(`Your browser doesn't support the Clipboard API`, 'error');\r\n return true;\r\n }\r\n}\r\nfunction checkNotFocusedError(error) {\r\n if (error instanceof Error &&\r\n error.message.toLowerCase().includes('document is not focused')) {\r\n toastMessage('You need to activate the \"Emulate a focused page\" setting in the \"Rendering\" panel of devtools.', 'warn');\r\n return true;\r\n }\r\n return false;\r\n}\r\nasync function actionGlobalCopyState(pinia) {\r\n if (checkClipboardAccess())\r\n return;\r\n try {\r\n await navigator.clipboard.writeText(JSON.stringify(pinia.state.value));\r\n toastMessage('Global state copied to clipboard.');\r\n }\r\n catch (error) {\r\n if (checkNotFocusedError(error))\r\n return;\r\n toastMessage(`Failed to serialize the state. Check the console for more details.`, 'error');\r\n console.error(error);\r\n }\r\n}\r\nasync function actionGlobalPasteState(pinia) {\r\n if (checkClipboardAccess())\r\n return;\r\n try {\r\n pinia.state.value = JSON.parse(await navigator.clipboard.readText());\r\n toastMessage('Global state pasted from clipboard.');\r\n }\r\n catch (error) {\r\n if (checkNotFocusedError(error))\r\n return;\r\n toastMessage(`Failed to deserialize the state from clipboard. Check the console for more details.`, 'error');\r\n console.error(error);\r\n }\r\n}\r\nasync function actionGlobalSaveState(pinia) {\r\n try {\r\n saveAs(new Blob([JSON.stringify(pinia.state.value)], {\r\n type: 'text/plain;charset=utf-8',\r\n }), 'pinia-state.json');\r\n }\r\n catch (error) {\r\n toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error');\r\n console.error(error);\r\n }\r\n}\r\nlet fileInput;\r\nfunction getFileOpener() {\r\n if (!fileInput) {\r\n fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.accept = '.json';\r\n }\r\n function openFile() {\r\n return new Promise((resolve, reject) => {\r\n fileInput.onchange = async () => {\r\n const files = fileInput.files;\r\n if (!files)\r\n return resolve(null);\r\n const file = files.item(0);\r\n if (!file)\r\n return resolve(null);\r\n return resolve({ text: await file.text(), file });\r\n };\r\n // @ts-ignore: TODO: changed from 4.3 to 4.4\r\n fileInput.oncancel = () => resolve(null);\r\n fileInput.onerror = reject;\r\n fileInput.click();\r\n });\r\n }\r\n return openFile;\r\n}\r\nasync function actionGlobalOpenStateFile(pinia) {\r\n try {\r\n const open = await getFileOpener();\r\n const result = await open();\r\n if (!result)\r\n return;\r\n const { text, file } = result;\r\n pinia.state.value = JSON.parse(text);\r\n toastMessage(`Global state imported from \"${file.name}\".`);\r\n }\r\n catch (error) {\r\n toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error');\r\n console.error(error);\r\n }\r\n}\n\nfunction formatDisplay(display) {\r\n return {\r\n _custom: {\r\n display,\r\n },\r\n };\r\n}\r\nconst PINIA_ROOT_LABEL = '🍍 Pinia (root)';\r\nconst PINIA_ROOT_ID = '_root';\r\nfunction formatStoreForInspectorTree(store) {\r\n return isPinia(store)\r\n ? {\r\n id: PINIA_ROOT_ID,\r\n label: PINIA_ROOT_LABEL,\r\n }\r\n : {\r\n id: store.$id,\r\n label: store.$id,\r\n };\r\n}\r\nfunction formatStoreForInspectorState(store) {\r\n if (isPinia(store)) {\r\n const storeNames = Array.from(store._s.keys());\r\n const storeMap = store._s;\r\n const state = {\r\n state: storeNames.map((storeId) => ({\r\n editable: true,\r\n key: storeId,\r\n value: store.state.value[storeId],\r\n })),\r\n getters: storeNames\r\n .filter((id) => storeMap.get(id)._getters)\r\n .map((id) => {\r\n const store = storeMap.get(id);\r\n return {\r\n editable: false,\r\n key: id,\r\n value: store._getters.reduce((getters, key) => {\r\n getters[key] = store[key];\r\n return getters;\r\n }, {}),\r\n };\r\n }),\r\n };\r\n return state;\r\n }\r\n const state = {\r\n state: Object.keys(store.$state).map((key) => ({\r\n editable: true,\r\n key,\r\n value: store.$state[key],\r\n })),\r\n };\r\n // avoid adding empty getters\r\n if (store._getters && store._getters.length) {\r\n state.getters = store._getters.map((getterName) => ({\r\n editable: false,\r\n key: getterName,\r\n value: store[getterName],\r\n }));\r\n }\r\n if (store._customProperties.size) {\r\n state.customProperties = Array.from(store._customProperties).map((key) => ({\r\n editable: true,\r\n key,\r\n value: store[key],\r\n }));\r\n }\r\n return state;\r\n}\r\nfunction formatEventData(events) {\r\n if (!events)\r\n return {};\r\n if (Array.isArray(events)) {\r\n // TODO: handle add and delete for arrays and objects\r\n return events.reduce((data, event) => {\r\n data.keys.push(event.key);\r\n data.operations.push(event.type);\r\n data.oldValue[event.key] = event.oldValue;\r\n data.newValue[event.key] = event.newValue;\r\n return data;\r\n }, {\r\n oldValue: {},\r\n keys: [],\r\n operations: [],\r\n newValue: {},\r\n });\r\n }\r\n else {\r\n return {\r\n operation: formatDisplay(events.type),\r\n key: formatDisplay(events.key),\r\n oldValue: events.oldValue,\r\n newValue: events.newValue,\r\n };\r\n }\r\n}\r\nfunction formatMutationType(type) {\r\n switch (type) {\r\n case MutationType.direct:\r\n return 'mutation';\r\n case MutationType.patchFunction:\r\n return '$patch';\r\n case MutationType.patchObject:\r\n return '$patch';\r\n default:\r\n return 'unknown';\r\n }\r\n}\n\n// timeline can be paused when directly changing the state\r\nlet isTimelineActive = true;\r\nconst componentStateTypes = [];\r\nconst MUTATIONS_LAYER_ID = 'pinia:mutations';\r\nconst INSPECTOR_ID = 'pinia';\r\n/**\r\n * Gets the displayed name of a store in devtools\r\n *\r\n * @param id - id of the store\r\n * @returns a formatted string\r\n */\r\nconst getStoreType = (id) => '🍍 ' + id;\r\n/**\r\n * Add the pinia plugin without any store. Allows displaying a Pinia plugin tab\r\n * as soon as it is added to the application.\r\n *\r\n * @param app - Vue application\r\n * @param pinia - pinia instance\r\n */\r\nfunction registerPiniaDevtools(app, pinia) {\r\n setupDevtoolsPlugin({\r\n id: 'dev.esm.pinia',\r\n label: 'Pinia 🍍',\r\n logo: 'https://pinia.vuejs.org/logo.svg',\r\n packageName: 'pinia',\r\n homepage: 'https://pinia.vuejs.org',\r\n componentStateTypes,\r\n app,\r\n }, (api) => {\r\n if (typeof api.now !== 'function') {\r\n toastMessage('You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\r\n }\r\n api.addTimelineLayer({\r\n id: MUTATIONS_LAYER_ID,\r\n label: `Pinia 🍍`,\r\n color: 0xe5df88,\r\n });\r\n api.addInspector({\r\n id: INSPECTOR_ID,\r\n label: 'Pinia 🍍',\r\n icon: 'storage',\r\n treeFilterPlaceholder: 'Search stores',\r\n actions: [\r\n {\r\n icon: 'content_copy',\r\n action: () => {\r\n actionGlobalCopyState(pinia);\r\n },\r\n tooltip: 'Serialize and copy the state',\r\n },\r\n {\r\n icon: 'content_paste',\r\n action: async () => {\r\n await actionGlobalPasteState(pinia);\r\n api.sendInspectorTree(INSPECTOR_ID);\r\n api.sendInspectorState(INSPECTOR_ID);\r\n },\r\n tooltip: 'Replace the state with the content of your clipboard',\r\n },\r\n {\r\n icon: 'save',\r\n action: () => {\r\n actionGlobalSaveState(pinia);\r\n },\r\n tooltip: 'Save the state as a JSON file',\r\n },\r\n {\r\n icon: 'folder_open',\r\n action: async () => {\r\n await actionGlobalOpenStateFile(pinia);\r\n api.sendInspectorTree(INSPECTOR_ID);\r\n api.sendInspectorState(INSPECTOR_ID);\r\n },\r\n tooltip: 'Import the state from a JSON file',\r\n },\r\n ],\r\n nodeActions: [\r\n {\r\n icon: 'restore',\r\n tooltip: 'Reset the state (option store only)',\r\n action: (nodeId) => {\r\n const store = pinia._s.get(nodeId);\r\n if (!store) {\r\n toastMessage(`Cannot reset \"${nodeId}\" store because it wasn't found.`, 'warn');\r\n }\r\n else if (!store._isOptionsAPI) {\r\n toastMessage(`Cannot reset \"${nodeId}\" store because it's a setup store.`, 'warn');\r\n }\r\n else {\r\n store.$reset();\r\n toastMessage(`Store \"${nodeId}\" reset.`);\r\n }\r\n },\r\n },\r\n ],\r\n });\r\n api.on.inspectComponent((payload, ctx) => {\r\n const proxy = (payload.componentInstance &&\r\n payload.componentInstance.proxy);\r\n if (proxy && proxy._pStores) {\r\n const piniaStores = payload.componentInstance.proxy._pStores;\r\n Object.values(piniaStores).forEach((store) => {\r\n payload.instanceData.state.push({\r\n type: getStoreType(store.$id),\r\n key: 'state',\r\n editable: true,\r\n value: store._isOptionsAPI\r\n ? {\r\n _custom: {\r\n value: toRaw(store.$state),\r\n actions: [\r\n {\r\n icon: 'restore',\r\n tooltip: 'Reset the state of this store',\r\n action: () => store.$reset(),\r\n },\r\n ],\r\n },\r\n }\r\n : // NOTE: workaround to unwrap transferred refs\r\n Object.keys(store.$state).reduce((state, key) => {\r\n state[key] = store.$state[key];\r\n return state;\r\n }, {}),\r\n });\r\n if (store._getters && store._getters.length) {\r\n payload.instanceData.state.push({\r\n type: getStoreType(store.$id),\r\n key: 'getters',\r\n editable: false,\r\n value: store._getters.reduce((getters, key) => {\r\n try {\r\n getters[key] = store[key];\r\n }\r\n catch (error) {\r\n // @ts-expect-error: we just want to show it in devtools\r\n getters[key] = error;\r\n }\r\n return getters;\r\n }, {}),\r\n });\r\n }\r\n });\r\n }\r\n });\r\n api.on.getInspectorTree((payload) => {\r\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\r\n let stores = [pinia];\r\n stores = stores.concat(Array.from(pinia._s.values()));\r\n payload.rootNodes = (payload.filter\r\n ? stores.filter((store) => '$id' in store\r\n ? store.$id\r\n .toLowerCase()\r\n .includes(payload.filter.toLowerCase())\r\n : PINIA_ROOT_LABEL.toLowerCase().includes(payload.filter.toLowerCase()))\r\n : stores).map(formatStoreForInspectorTree);\r\n }\r\n });\r\n api.on.getInspectorState((payload) => {\r\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\r\n const inspectedStore = payload.nodeId === PINIA_ROOT_ID\r\n ? pinia\r\n : pinia._s.get(payload.nodeId);\r\n if (!inspectedStore) {\r\n // this could be the selected store restored for a different project\r\n // so it's better not to say anything here\r\n return;\r\n }\r\n if (inspectedStore) {\r\n payload.state = formatStoreForInspectorState(inspectedStore);\r\n }\r\n }\r\n });\r\n api.on.editInspectorState((payload, ctx) => {\r\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\r\n const inspectedStore = payload.nodeId === PINIA_ROOT_ID\r\n ? pinia\r\n : pinia._s.get(payload.nodeId);\r\n if (!inspectedStore) {\r\n return toastMessage(`store \"${payload.nodeId}\" not found`, 'error');\r\n }\r\n const { path } = payload;\r\n if (!isPinia(inspectedStore)) {\r\n // access only the state\r\n if (path.length !== 1 ||\r\n !inspectedStore._customProperties.has(path[0]) ||\r\n path[0] in inspectedStore.$state) {\r\n path.unshift('$state');\r\n }\r\n }\r\n else {\r\n // Root access, we can omit the `.value` because the devtools API does it for us\r\n path.unshift('state');\r\n }\r\n isTimelineActive = false;\r\n payload.set(inspectedStore, path, payload.state.value);\r\n isTimelineActive = true;\r\n }\r\n });\r\n api.on.editComponentState((payload) => {\r\n if (payload.type.startsWith('🍍')) {\r\n const storeId = payload.type.replace(/^🍍\\s*/, '');\r\n const store = pinia._s.get(storeId);\r\n if (!store) {\r\n return toastMessage(`store \"${storeId}\" not found`, 'error');\r\n }\r\n const { path } = payload;\r\n if (path[0] !== 'state') {\r\n return toastMessage(`Invalid path for store \"${storeId}\":\\n${path}\\nOnly state can be modified.`);\r\n }\r\n // rewrite the first entry to be able to directly set the state as\r\n // well as any other path\r\n path[0] = '$state';\r\n isTimelineActive = false;\r\n payload.set(store, path, payload.state.value);\r\n isTimelineActive = true;\r\n }\r\n });\r\n });\r\n}\r\nfunction addStoreToDevtools(app, store) {\r\n if (!componentStateTypes.includes(getStoreType(store.$id))) {\r\n componentStateTypes.push(getStoreType(store.$id));\r\n }\r\n setupDevtoolsPlugin({\r\n id: 'dev.esm.pinia',\r\n label: 'Pinia 🍍',\r\n logo: 'https://pinia.vuejs.org/logo.svg',\r\n packageName: 'pinia',\r\n homepage: 'https://pinia.vuejs.org',\r\n componentStateTypes,\r\n app,\r\n settings: {\r\n logStoreChanges: {\r\n label: 'Notify about new/deleted stores',\r\n type: 'boolean',\r\n defaultValue: true,\r\n },\r\n // useEmojis: {\r\n // label: 'Use emojis in messages ⚡️',\r\n // type: 'boolean',\r\n // defaultValue: true,\r\n // },\r\n },\r\n }, (api) => {\r\n // gracefully handle errors\r\n const now = typeof api.now === 'function' ? api.now.bind(api) : Date.now;\r\n store.$onAction(({ after, onError, name, args }) => {\r\n const groupId = runningActionId++;\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: {\r\n time: now(),\r\n title: '🛫 ' + name,\r\n subtitle: 'start',\r\n data: {\r\n store: formatDisplay(store.$id),\r\n action: formatDisplay(name),\r\n args,\r\n },\r\n groupId,\r\n },\r\n });\r\n after((result) => {\r\n activeAction = undefined;\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: {\r\n time: now(),\r\n title: '🛬 ' + name,\r\n subtitle: 'end',\r\n data: {\r\n store: formatDisplay(store.$id),\r\n action: formatDisplay(name),\r\n args,\r\n result,\r\n },\r\n groupId,\r\n },\r\n });\r\n });\r\n onError((error) => {\r\n activeAction = undefined;\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: {\r\n time: now(),\r\n logType: 'error',\r\n title: '💥 ' + name,\r\n subtitle: 'end',\r\n data: {\r\n store: formatDisplay(store.$id),\r\n action: formatDisplay(name),\r\n args,\r\n error,\r\n },\r\n groupId,\r\n },\r\n });\r\n });\r\n }, true);\r\n store._customProperties.forEach((name) => {\r\n watch(() => unref(store[name]), (newValue, oldValue) => {\r\n api.notifyComponentUpdate();\r\n api.sendInspectorState(INSPECTOR_ID);\r\n if (isTimelineActive) {\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: {\r\n time: now(),\r\n title: 'Change',\r\n subtitle: name,\r\n data: {\r\n newValue,\r\n oldValue,\r\n },\r\n groupId: activeAction,\r\n },\r\n });\r\n }\r\n }, { deep: true });\r\n });\r\n store.$subscribe(({ events, type }, state) => {\r\n api.notifyComponentUpdate();\r\n api.sendInspectorState(INSPECTOR_ID);\r\n if (!isTimelineActive)\r\n return;\r\n // rootStore.state[store.id] = state\r\n const eventData = {\r\n time: now(),\r\n title: formatMutationType(type),\r\n data: {\r\n store: formatDisplay(store.$id),\r\n ...formatEventData(events),\r\n },\r\n groupId: activeAction,\r\n };\r\n // reset for the next mutation\r\n activeAction = undefined;\r\n if (type === MutationType.patchFunction) {\r\n eventData.subtitle = '⤵️';\r\n }\r\n else if (type === MutationType.patchObject) {\r\n eventData.subtitle = '🧩';\r\n }\r\n else if (events && !Array.isArray(events)) {\r\n eventData.subtitle = events.type;\r\n }\r\n if (events) {\r\n eventData.data['rawEvent(s)'] = {\r\n _custom: {\r\n display: 'DebuggerEvent',\r\n type: 'object',\r\n tooltip: 'raw DebuggerEvent[]',\r\n value: events,\r\n },\r\n };\r\n }\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: eventData,\r\n });\r\n }, { detached: true, flush: 'sync' });\r\n const hotUpdate = store._hotUpdate;\r\n store._hotUpdate = markRaw((newStore) => {\r\n hotUpdate(newStore);\r\n api.addTimelineEvent({\r\n layerId: MUTATIONS_LAYER_ID,\r\n event: {\r\n time: now(),\r\n title: '🔥 ' + store.$id,\r\n subtitle: 'HMR update',\r\n data: {\r\n store: formatDisplay(store.$id),\r\n info: formatDisplay(`HMR update`),\r\n },\r\n },\r\n });\r\n // update the devtools too\r\n api.notifyComponentUpdate();\r\n api.sendInspectorTree(INSPECTOR_ID);\r\n api.sendInspectorState(INSPECTOR_ID);\r\n });\r\n const { $dispose } = store;\r\n store.$dispose = () => {\r\n $dispose();\r\n api.notifyComponentUpdate();\r\n api.sendInspectorTree(INSPECTOR_ID);\r\n api.sendInspectorState(INSPECTOR_ID);\r\n api.getSettings().logStoreChanges &&\r\n toastMessage(`Disposed \"${store.$id}\" store 🗑`);\r\n };\r\n // trigger an update so it can display new registered stores\r\n api.notifyComponentUpdate();\r\n api.sendInspectorTree(INSPECTOR_ID);\r\n api.sendInspectorState(INSPECTOR_ID);\r\n api.getSettings().logStoreChanges &&\r\n toastMessage(`\"${store.$id}\" store installed 🆕`);\r\n });\r\n}\r\nlet runningActionId = 0;\r\nlet activeAction;\r\n/**\r\n * Patches a store to enable action grouping in devtools by wrapping the store with a Proxy that is passed as the\r\n * context of all actions, allowing us to set `runningAction` on each access and effectively associating any state\r\n * mutation to the action.\r\n *\r\n * @param store - store to patch\r\n * @param actionNames - list of actionst to patch\r\n */\r\nfunction patchActionForGrouping(store, actionNames) {\r\n // original actions of the store as they are given by pinia. We are going to override them\r\n const actions = actionNames.reduce((storeActions, actionName) => {\r\n // use toRaw to avoid tracking #541\r\n storeActions[actionName] = toRaw(store)[actionName];\r\n return storeActions;\r\n }, {});\r\n for (const actionName in actions) {\r\n store[actionName] = function () {\r\n // setActivePinia(store._p)\r\n // the running action id is incremented in a before action hook\r\n const _actionId = runningActionId;\r\n const trackedStore = new Proxy(store, {\r\n get(...args) {\r\n activeAction = _actionId;\r\n return Reflect.get(...args);\r\n },\r\n set(...args) {\r\n activeAction = _actionId;\r\n return Reflect.set(...args);\r\n },\r\n });\r\n return actions[actionName].apply(trackedStore, arguments);\r\n };\r\n }\r\n}\r\n/**\r\n * pinia.use(devtoolsPlugin)\r\n */\r\nfunction devtoolsPlugin({ app, store, options }) {\r\n // HMR module\r\n if (store.$id.startsWith('__hot:')) {\r\n return;\r\n }\r\n // detect option api vs setup api\r\n if (options.state) {\r\n store._isOptionsAPI = true;\r\n }\r\n // only wrap actions in option-defined stores as this technique relies on\r\n // wrapping the context of the action with a proxy\r\n if (typeof options.state === 'function') {\r\n patchActionForGrouping(\r\n // @ts-expect-error: can cast the store...\r\n store, Object.keys(options.actions));\r\n const originalHotUpdate = store._hotUpdate;\r\n // Upgrade the HMR to also update the new actions\r\n toRaw(store)._hotUpdate = function (newStore) {\r\n originalHotUpdate.apply(this, arguments);\r\n patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions));\r\n };\r\n }\r\n addStoreToDevtools(app, \r\n // FIXME: is there a way to allow the assignment from Store to StoreGeneric?\r\n store);\r\n}\n\n/**\r\n * Creates a Pinia instance to be used by the application\r\n */\r\nfunction createPinia() {\r\n const scope = effectScope(true);\r\n // NOTE: here we could check the window object for a state and directly set it\r\n // if there is anything like it with Vue 3 SSR\r\n const state = scope.run(() => ref({}));\r\n let _p = [];\r\n // plugins added before calling app.use(pinia)\r\n let toBeInstalled = [];\r\n const pinia = markRaw({\r\n install(app) {\r\n // this allows calling useStore() outside of a component setup after\r\n // installing pinia's plugin\r\n setActivePinia(pinia);\r\n if (!isVue2) {\r\n pinia._a = app;\r\n app.provide(piniaSymbol, pinia);\r\n app.config.globalProperties.$pinia = pinia;\r\n /* istanbul ignore else */\r\n if (USE_DEVTOOLS) {\r\n registerPiniaDevtools(app, pinia);\r\n }\r\n toBeInstalled.forEach((plugin) => _p.push(plugin));\r\n toBeInstalled = [];\r\n }\r\n },\r\n use(plugin) {\r\n if (!this._a && !isVue2) {\r\n toBeInstalled.push(plugin);\r\n }\r\n else {\r\n _p.push(plugin);\r\n }\r\n return this;\r\n },\r\n _p,\r\n // it's actually undefined here\r\n // @ts-expect-error\r\n _a: null,\r\n _e: scope,\r\n _s: new Map(),\r\n state,\r\n });\r\n // pinia devtools rely on dev only features so they cannot be forced unless\r\n // the dev build of Vue is used. Avoid old browsers like IE11.\r\n if (USE_DEVTOOLS && typeof Proxy !== 'undefined') {\r\n pinia.use(devtoolsPlugin);\r\n }\r\n return pinia;\r\n}\n\n/**\r\n * Checks if a function is a `StoreDefinition`.\r\n *\r\n * @param fn - object to test\r\n * @returns true if `fn` is a StoreDefinition\r\n */\r\nconst isUseStore = (fn) => {\r\n return typeof fn === 'function' && typeof fn.$id === 'string';\r\n};\r\n/**\r\n * Mutates in place `newState` with `oldState` to _hot update_ it. It will\r\n * remove any key not existing in `newState` and recursively merge plain\r\n * objects.\r\n *\r\n * @param newState - new state object to be patched\r\n * @param oldState - old state that should be used to patch newState\r\n * @returns - newState\r\n */\r\nfunction patchObject(newState, oldState) {\r\n // no need to go through symbols because they cannot be serialized anyway\r\n for (const key in oldState) {\r\n const subPatch = oldState[key];\r\n // skip the whole sub tree\r\n if (!(key in newState)) {\r\n continue;\r\n }\r\n const targetValue = newState[key];\r\n if (isPlainObject(targetValue) &&\r\n isPlainObject(subPatch) &&\r\n !isRef(subPatch) &&\r\n !isReactive(subPatch)) {\r\n newState[key] = patchObject(targetValue, subPatch);\r\n }\r\n else {\r\n // objects are either a bit more complex (e.g. refs) or primitives, so we\r\n // just set the whole thing\r\n if (isVue2) {\r\n set(newState, key, subPatch);\r\n }\r\n else {\r\n newState[key] = subPatch;\r\n }\r\n }\r\n }\r\n return newState;\r\n}\r\n/**\r\n * Creates an _accept_ function to pass to `import.meta.hot` in Vite applications.\r\n *\r\n * @example\r\n * ```js\r\n * const useUser = defineStore(...)\r\n * if (import.meta.hot) {\r\n * import.meta.hot.accept(acceptHMRUpdate(useUser, import.meta.hot))\r\n * }\r\n * ```\r\n *\r\n * @param initialUseStore - return of the defineStore to hot update\r\n * @param hot - `import.meta.hot`\r\n */\r\nfunction acceptHMRUpdate(initialUseStore, hot) {\r\n // strip as much as possible from iife.prod\r\n if (!(process.env.NODE_ENV !== 'production')) {\r\n return () => { };\r\n }\r\n return (newModule) => {\r\n const pinia = hot.data.pinia || initialUseStore._pinia;\r\n if (!pinia) {\r\n // this store is still not used\r\n return;\r\n }\r\n // preserve the pinia instance across loads\r\n hot.data.pinia = pinia;\r\n // console.log('got data', newStore)\r\n for (const exportName in newModule) {\r\n const useStore = newModule[exportName];\r\n // console.log('checking for', exportName)\r\n if (isUseStore(useStore) && pinia._s.has(useStore.$id)) {\r\n // console.log('Accepting update for', useStore.$id)\r\n const id = useStore.$id;\r\n if (id !== initialUseStore.$id) {\r\n console.warn(`The id of the store changed from \"${initialUseStore.$id}\" to \"${id}\". Reloading.`);\r\n // return import.meta.hot.invalidate()\r\n return hot.invalidate();\r\n }\r\n const existingStore = pinia._s.get(id);\r\n if (!existingStore) {\r\n console.log(`[Pinia]: skipping hmr because store doesn't exist yet`);\r\n return;\r\n }\r\n useStore(pinia, existingStore);\r\n }\r\n }\r\n };\r\n}\n\nconst noop = () => { };\r\nfunction addSubscription(subscriptions, callback, detached, onCleanup = noop) {\r\n subscriptions.push(callback);\r\n const removeSubscription = () => {\r\n const idx = subscriptions.indexOf(callback);\r\n if (idx > -1) {\r\n subscriptions.splice(idx, 1);\r\n onCleanup();\r\n }\r\n };\r\n if (!detached && getCurrentScope()) {\r\n onScopeDispose(removeSubscription);\r\n }\r\n return removeSubscription;\r\n}\r\nfunction triggerSubscriptions(subscriptions, ...args) {\r\n subscriptions.slice().forEach((callback) => {\r\n callback(...args);\r\n });\r\n}\n\nfunction mergeReactiveObjects(target, patchToApply) {\r\n // Handle Map instances\r\n if (target instanceof Map && patchToApply instanceof Map) {\r\n patchToApply.forEach((value, key) => target.set(key, value));\r\n }\r\n // Handle Set instances\r\n if (target instanceof Set && patchToApply instanceof Set) {\r\n patchToApply.forEach(target.add, target);\r\n }\r\n // no need to go through symbols because they cannot be serialized anyway\r\n for (const key in patchToApply) {\r\n if (!patchToApply.hasOwnProperty(key))\r\n continue;\r\n const subPatch = patchToApply[key];\r\n const targetValue = target[key];\r\n if (isPlainObject(targetValue) &&\r\n isPlainObject(subPatch) &&\r\n target.hasOwnProperty(key) &&\r\n !isRef(subPatch) &&\r\n !isReactive(subPatch)) {\r\n // NOTE: here I wanted to warn about inconsistent types but it's not possible because in setup stores one might\r\n // start the value of a property as a certain type e.g. a Map, and then for some reason, during SSR, change that\r\n // to `undefined`. When trying to hydrate, we want to override the Map with `undefined`.\r\n target[key] = mergeReactiveObjects(targetValue, subPatch);\r\n }\r\n else {\r\n // @ts-expect-error: subPatch is a valid value\r\n target[key] = subPatch;\r\n }\r\n }\r\n return target;\r\n}\r\nconst skipHydrateSymbol = (process.env.NODE_ENV !== 'production')\r\n ? Symbol('pinia:skipHydration')\r\n : /* istanbul ignore next */ Symbol();\r\nconst skipHydrateMap = /*#__PURE__*/ new WeakMap();\r\n/**\r\n * Tells Pinia to skip the hydration process of a given object. This is useful in setup stores (only) when you return a\r\n * stateful object in the store but it isn't really state. e.g. returning a router instance in a setup store.\r\n *\r\n * @param obj - target object\r\n * @returns obj\r\n */\r\nfunction skipHydrate(obj) {\r\n return isVue2\r\n ? // in @vue/composition-api, the refs are sealed so defineProperty doesn't work...\r\n /* istanbul ignore next */ skipHydrateMap.set(obj, 1) && obj\r\n : Object.defineProperty(obj, skipHydrateSymbol, {});\r\n}\r\n/**\r\n * Returns whether a value should be hydrated\r\n *\r\n * @param obj - target variable\r\n * @returns true if `obj` should be hydrated\r\n */\r\nfunction shouldHydrate(obj) {\r\n return isVue2\r\n ? /* istanbul ignore next */ !skipHydrateMap.has(obj)\r\n : !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol);\r\n}\r\nconst { assign } = Object;\r\nfunction isComputed(o) {\r\n return !!(isRef(o) && o.effect);\r\n}\r\nfunction createOptionsStore(id, options, pinia, hot) {\r\n const { state, actions, getters } = options;\r\n const initialState = pinia.state.value[id];\r\n let store;\r\n function setup() {\r\n if (!initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n set(pinia.state.value, id, state ? state() : {});\r\n }\r\n else {\r\n pinia.state.value[id] = state ? state() : {};\r\n }\r\n }\r\n // avoid creating a state in pinia.state.value\r\n const localState = (process.env.NODE_ENV !== 'production') && hot\r\n ? // use ref() to unwrap refs inside state TODO: check if this is still necessary\r\n toRefs(ref(state ? state() : {}).value)\r\n : toRefs(pinia.state.value[id]);\r\n return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => {\r\n if ((process.env.NODE_ENV !== 'production') && name in localState) {\r\n console.warn(`[🍍]: A getter cannot have the same name as another state property. Rename one of them. Found with \"${name}\" in store \"${id}\".`);\r\n }\r\n computedGetters[name] = markRaw(computed(() => {\r\n setActivePinia(pinia);\r\n // it was created just before\r\n const store = pinia._s.get(id);\r\n // allow cross using stores\r\n /* istanbul ignore next */\r\n if (isVue2 && !store._r)\r\n return;\r\n // @ts-expect-error\r\n // return getters![name].call(context, context)\r\n // TODO: avoid reading the getter while assigning with a global variable\r\n return getters[name].call(store, store);\r\n }));\r\n return computedGetters;\r\n }, {}));\r\n }\r\n store = createSetupStore(id, setup, options, pinia, hot, true);\r\n store.$reset = function $reset() {\r\n const newState = state ? state() : {};\r\n // we use a patch to group all changes into one single subscription\r\n this.$patch(($state) => {\r\n assign($state, newState);\r\n });\r\n };\r\n return store;\r\n}\r\nfunction createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) {\r\n let scope;\r\n const optionsForPlugin = assign({ actions: {} }, options);\r\n /* istanbul ignore if */\r\n // @ts-expect-error: active is an internal property\r\n if ((process.env.NODE_ENV !== 'production') && !pinia._e.active) {\r\n throw new Error('Pinia destroyed');\r\n }\r\n // watcher options for $subscribe\r\n const $subscribeOptions = {\r\n deep: true,\r\n // flush: 'post',\r\n };\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production') && !isVue2) {\r\n $subscribeOptions.onTrigger = (event) => {\r\n /* istanbul ignore else */\r\n if (isListening) {\r\n debuggerEvents = event;\r\n // avoid triggering this while the store is being built and the state is being set in pinia\r\n }\r\n else if (isListening == false && !store._hotUpdating) {\r\n // let patch send all the events together later\r\n /* istanbul ignore else */\r\n if (Array.isArray(debuggerEvents)) {\r\n debuggerEvents.push(event);\r\n }\r\n else {\r\n console.error('🍍 debuggerEvents should be an array. This is most likely an internal Pinia bug.');\r\n }\r\n }\r\n };\r\n }\r\n // internal state\r\n let isListening; // set to true at the end\r\n let isSyncListening; // set to true at the end\r\n let subscriptions = markRaw([]);\r\n let actionSubscriptions = markRaw([]);\r\n let debuggerEvents;\r\n const initialState = pinia.state.value[$id];\r\n // avoid setting the state for option stores if it is set\r\n // by the setup\r\n if (!isOptionsStore && !initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n set(pinia.state.value, $id, {});\r\n }\r\n else {\r\n pinia.state.value[$id] = {};\r\n }\r\n }\r\n const hotState = ref({});\r\n // avoid triggering too many listeners\r\n // https://github.com/vuejs/pinia/issues/1129\r\n let activeListener;\r\n function $patch(partialStateOrMutator) {\r\n let subscriptionMutation;\r\n isListening = isSyncListening = false;\r\n // reset the debugger events since patches are sync\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production')) {\r\n debuggerEvents = [];\r\n }\r\n if (typeof partialStateOrMutator === 'function') {\r\n partialStateOrMutator(pinia.state.value[$id]);\r\n subscriptionMutation = {\r\n type: MutationType.patchFunction,\r\n storeId: $id,\r\n events: debuggerEvents,\r\n };\r\n }\r\n else {\r\n mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator);\r\n subscriptionMutation = {\r\n type: MutationType.patchObject,\r\n payload: partialStateOrMutator,\r\n storeId: $id,\r\n events: debuggerEvents,\r\n };\r\n }\r\n const myListenerId = (activeListener = Symbol());\r\n nextTick().then(() => {\r\n if (activeListener === myListenerId) {\r\n isListening = true;\r\n }\r\n });\r\n isSyncListening = true;\r\n // because we paused the watcher, we need to manually call the subscriptions\r\n triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]);\r\n }\r\n /* istanbul ignore next */\r\n const $reset = (process.env.NODE_ENV !== 'production')\r\n ? () => {\r\n throw new Error(`🍍: Store \"${$id}\" is built using the setup syntax and does not implement $reset().`);\r\n }\r\n : noop;\r\n function $dispose() {\r\n scope.stop();\r\n subscriptions = [];\r\n actionSubscriptions = [];\r\n pinia._s.delete($id);\r\n }\r\n /**\r\n * Wraps an action to handle subscriptions.\r\n *\r\n * @param name - name of the action\r\n * @param action - action to wrap\r\n * @returns a wrapped action to handle subscriptions\r\n */\r\n function wrapAction(name, action) {\r\n return function () {\r\n setActivePinia(pinia);\r\n const args = Array.from(arguments);\r\n const afterCallbackList = [];\r\n const onErrorCallbackList = [];\r\n function after(callback) {\r\n afterCallbackList.push(callback);\r\n }\r\n function onError(callback) {\r\n onErrorCallbackList.push(callback);\r\n }\r\n // @ts-expect-error\r\n triggerSubscriptions(actionSubscriptions, {\r\n args,\r\n name,\r\n store,\r\n after,\r\n onError,\r\n });\r\n let ret;\r\n try {\r\n ret = action.apply(this && this.$id === $id ? this : store, args);\r\n // handle sync errors\r\n }\r\n catch (error) {\r\n triggerSubscriptions(onErrorCallbackList, error);\r\n throw error;\r\n }\r\n if (ret instanceof Promise) {\r\n return ret\r\n .then((value) => {\r\n triggerSubscriptions(afterCallbackList, value);\r\n return value;\r\n })\r\n .catch((error) => {\r\n triggerSubscriptions(onErrorCallbackList, error);\r\n return Promise.reject(error);\r\n });\r\n }\r\n // allow the afterCallback to override the return value\r\n triggerSubscriptions(afterCallbackList, ret);\r\n return ret;\r\n };\r\n }\r\n const _hmrPayload = /*#__PURE__*/ markRaw({\r\n actions: {},\r\n getters: {},\r\n state: [],\r\n hotState,\r\n });\r\n const partialStore = {\r\n _p: pinia,\r\n // _s: scope,\r\n $id,\r\n $onAction: addSubscription.bind(null, actionSubscriptions),\r\n $patch,\r\n $reset,\r\n $subscribe(callback, options = {}) {\r\n const removeSubscription = addSubscription(subscriptions, callback, options.detached, () => stopWatcher());\r\n const stopWatcher = scope.run(() => watch(() => pinia.state.value[$id], (state) => {\r\n if (options.flush === 'sync' ? isSyncListening : isListening) {\r\n callback({\r\n storeId: $id,\r\n type: MutationType.direct,\r\n events: debuggerEvents,\r\n }, state);\r\n }\r\n }, assign({}, $subscribeOptions, options)));\r\n return removeSubscription;\r\n },\r\n $dispose,\r\n };\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n // start as non ready\r\n partialStore._r = false;\r\n }\r\n const store = reactive((process.env.NODE_ENV !== 'production') || USE_DEVTOOLS\r\n ? assign({\r\n _hmrPayload,\r\n _customProperties: markRaw(new Set()), // devtools custom properties\r\n }, partialStore\r\n // must be added later\r\n // setupStore\r\n )\r\n : partialStore);\r\n // store the partial store now so the setup of stores can instantiate each other before they are finished without\r\n // creating infinite loops.\r\n pinia._s.set($id, store);\r\n // TODO: idea create skipSerialize that marks properties as non serializable and they are skipped\r\n const setupStore = pinia._e.run(() => {\r\n scope = effectScope();\r\n return scope.run(() => setup());\r\n });\r\n // overwrite existing actions to support $onAction\r\n for (const key in setupStore) {\r\n const prop = setupStore[key];\r\n if ((isRef(prop) && !isComputed(prop)) || isReactive(prop)) {\r\n // mark it as a piece of state to be serialized\r\n if ((process.env.NODE_ENV !== 'production') && hot) {\r\n set(hotState.value, key, toRef(setupStore, key));\r\n // createOptionStore directly sets the state in pinia.state.value so we\r\n // can just skip that\r\n }\r\n else if (!isOptionsStore) {\r\n // in setup stores we must hydrate the state and sync pinia state tree with the refs the user just created\r\n if (initialState && shouldHydrate(prop)) {\r\n if (isRef(prop)) {\r\n prop.value = initialState[key];\r\n }\r\n else {\r\n // probably a reactive object, lets recursively assign\r\n // @ts-expect-error: prop is unknown\r\n mergeReactiveObjects(prop, initialState[key]);\r\n }\r\n }\r\n // transfer the ref to the pinia state to keep everything in sync\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n set(pinia.state.value[$id], key, prop);\r\n }\r\n else {\r\n pinia.state.value[$id][key] = prop;\r\n }\r\n }\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production')) {\r\n _hmrPayload.state.push(key);\r\n }\r\n // action\r\n }\r\n else if (typeof prop === 'function') {\r\n // @ts-expect-error: we are overriding the function we avoid wrapping if\r\n const actionValue = (process.env.NODE_ENV !== 'production') && hot ? prop : wrapAction(key, prop);\r\n // this a hot module replacement store because the hotUpdate method needs\r\n // to do it with the right context\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n set(setupStore, key, actionValue);\r\n }\r\n else {\r\n // @ts-expect-error\r\n setupStore[key] = actionValue;\r\n }\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production')) {\r\n _hmrPayload.actions[key] = prop;\r\n }\r\n // list actions so they can be used in plugins\r\n // @ts-expect-error\r\n optionsForPlugin.actions[key] = prop;\r\n }\r\n else if ((process.env.NODE_ENV !== 'production')) {\r\n // add getters for devtools\r\n if (isComputed(prop)) {\r\n _hmrPayload.getters[key] = isOptionsStore\r\n ? // @ts-expect-error\r\n options.getters[key]\r\n : prop;\r\n if (IS_CLIENT) {\r\n const getters = setupStore._getters ||\r\n // @ts-expect-error: same\r\n (setupStore._getters = markRaw([]));\r\n getters.push(key);\r\n }\r\n }\r\n }\r\n }\r\n // add the state, getters, and action properties\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n Object.keys(setupStore).forEach((key) => {\r\n set(store, key, setupStore[key]);\r\n });\r\n }\r\n else {\r\n assign(store, setupStore);\r\n // allows retrieving reactive objects with `storeToRefs()`. Must be called after assigning to the reactive object.\r\n // Make `storeToRefs()` work with `reactive()` #799\r\n assign(toRaw(store), setupStore);\r\n }\r\n // use this instead of a computed with setter to be able to create it anywhere\r\n // without linking the computed lifespan to wherever the store is first\r\n // created.\r\n Object.defineProperty(store, '$state', {\r\n get: () => ((process.env.NODE_ENV !== 'production') && hot ? hotState.value : pinia.state.value[$id]),\r\n set: (state) => {\r\n /* istanbul ignore if */\r\n if ((process.env.NODE_ENV !== 'production') && hot) {\r\n throw new Error('cannot set hotState');\r\n }\r\n $patch(($state) => {\r\n assign($state, state);\r\n });\r\n },\r\n });\r\n // add the hotUpdate before plugins to allow them to override it\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production')) {\r\n store._hotUpdate = markRaw((newStore) => {\r\n store._hotUpdating = true;\r\n newStore._hmrPayload.state.forEach((stateKey) => {\r\n if (stateKey in store.$state) {\r\n const newStateTarget = newStore.$state[stateKey];\r\n const oldStateSource = store.$state[stateKey];\r\n if (typeof newStateTarget === 'object' &&\r\n isPlainObject(newStateTarget) &&\r\n isPlainObject(oldStateSource)) {\r\n patchObject(newStateTarget, oldStateSource);\r\n }\r\n else {\r\n // transfer the ref\r\n newStore.$state[stateKey] = oldStateSource;\r\n }\r\n }\r\n // patch direct access properties to allow store.stateProperty to work as\r\n // store.$state.stateProperty\r\n set(store, stateKey, toRef(newStore.$state, stateKey));\r\n });\r\n // remove deleted state properties\r\n Object.keys(store.$state).forEach((stateKey) => {\r\n if (!(stateKey in newStore.$state)) {\r\n del(store, stateKey);\r\n }\r\n });\r\n // avoid devtools logging this as a mutation\r\n isListening = false;\r\n isSyncListening = false;\r\n pinia.state.value[$id] = toRef(newStore._hmrPayload, 'hotState');\r\n isSyncListening = true;\r\n nextTick().then(() => {\r\n isListening = true;\r\n });\r\n for (const actionName in newStore._hmrPayload.actions) {\r\n const action = newStore[actionName];\r\n set(store, actionName, wrapAction(actionName, action));\r\n }\r\n // TODO: does this work in both setup and option store?\r\n for (const getterName in newStore._hmrPayload.getters) {\r\n const getter = newStore._hmrPayload.getters[getterName];\r\n const getterValue = isOptionsStore\r\n ? // special handling of options api\r\n computed(() => {\r\n setActivePinia(pinia);\r\n return getter.call(store, store);\r\n })\r\n : getter;\r\n set(store, getterName, getterValue);\r\n }\r\n // remove deleted getters\r\n Object.keys(store._hmrPayload.getters).forEach((key) => {\r\n if (!(key in newStore._hmrPayload.getters)) {\r\n del(store, key);\r\n }\r\n });\r\n // remove old actions\r\n Object.keys(store._hmrPayload.actions).forEach((key) => {\r\n if (!(key in newStore._hmrPayload.actions)) {\r\n del(store, key);\r\n }\r\n });\r\n // update the values used in devtools and to allow deleting new properties later on\r\n store._hmrPayload = newStore._hmrPayload;\r\n store._getters = newStore._getters;\r\n store._hotUpdating = false;\r\n });\r\n }\r\n if (USE_DEVTOOLS) {\r\n const nonEnumerable = {\r\n writable: true,\r\n configurable: true,\r\n // avoid warning on devtools trying to display this property\r\n enumerable: false,\r\n };\r\n ['_p', '_hmrPayload', '_getters', '_customProperties'].forEach((p) => {\r\n Object.defineProperty(store, p, {\r\n value: store[p],\r\n ...nonEnumerable,\r\n });\r\n });\r\n }\r\n /* istanbul ignore if */\r\n if (isVue2) {\r\n // mark the store as ready before plugins\r\n store._r = true;\r\n }\r\n // apply all plugins\r\n pinia._p.forEach((extender) => {\r\n /* istanbul ignore else */\r\n if (USE_DEVTOOLS) {\r\n const extensions = scope.run(() => extender({\r\n store,\r\n app: pinia._a,\r\n pinia,\r\n options: optionsForPlugin,\r\n }));\r\n Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key));\r\n assign(store, extensions);\r\n }\r\n else {\r\n assign(store, scope.run(() => extender({\r\n store,\r\n app: pinia._a,\r\n pinia,\r\n options: optionsForPlugin,\r\n })));\r\n }\r\n });\r\n if ((process.env.NODE_ENV !== 'production') &&\r\n store.$state &&\r\n typeof store.$state === 'object' &&\r\n typeof store.$state.constructor === 'function' &&\r\n !store.$state.constructor.toString().includes('[native code]')) {\r\n console.warn(`[🍍]: The \"state\" must be a plain object. It cannot be\\n` +\r\n `\\tstate: () => new MyClass()\\n` +\r\n `Found in store \"${store.$id}\".`);\r\n }\r\n // only apply hydrate to option stores with an initial state in pinia\r\n if (initialState &&\r\n isOptionsStore &&\r\n options.hydrate) {\r\n options.hydrate(store.$state, initialState);\r\n }\r\n isListening = true;\r\n isSyncListening = true;\r\n return store;\r\n}\r\nfunction defineStore(\r\n// TODO: add proper types from above\r\nidOrOptions, setup, setupOptions) {\r\n let id;\r\n let options;\r\n const isSetupStore = typeof setup === 'function';\r\n if (typeof idOrOptions === 'string') {\r\n id = idOrOptions;\r\n // the option store setup will contain the actual options in this case\r\n options = isSetupStore ? setupOptions : setup;\r\n }\r\n else {\r\n options = idOrOptions;\r\n id = idOrOptions.id;\r\n }\r\n function useStore(pinia, hot) {\r\n const currentInstance = getCurrentInstance();\r\n pinia =\r\n // in test mode, ignore the argument provided as we can always retrieve a\r\n // pinia instance with getActivePinia()\r\n ((process.env.NODE_ENV === 'test') && activePinia && activePinia._testing ? null : pinia) ||\r\n (currentInstance && inject(piniaSymbol, null));\r\n if (pinia)\r\n setActivePinia(pinia);\r\n if ((process.env.NODE_ENV !== 'production') && !activePinia) {\r\n throw new Error(`[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?\\n` +\r\n `\\tconst pinia = createPinia()\\n` +\r\n `\\tapp.use(pinia)\\n` +\r\n `This will fail in production.`);\r\n }\r\n pinia = activePinia;\r\n if (!pinia._s.has(id)) {\r\n // creating the store registers it in `pinia._s`\r\n if (isSetupStore) {\r\n createSetupStore(id, setup, options, pinia);\r\n }\r\n else {\r\n createOptionsStore(id, options, pinia);\r\n }\r\n /* istanbul ignore else */\r\n if ((process.env.NODE_ENV !== 'production')) {\r\n // @ts-expect-error: not the right inferred type\r\n useStore._pinia = pinia;\r\n }\r\n }\r\n const store = pinia._s.get(id);\r\n if ((process.env.NODE_ENV !== 'production') && hot) {\r\n const hotId = '__hot:' + id;\r\n const newStore = isSetupStore\r\n ? createSetupStore(hotId, setup, options, pinia, true)\r\n : createOptionsStore(hotId, assign({}, options), pinia, true);\r\n hot._hotUpdate(newStore);\r\n // cleanup the state properties and the store from the cache\r\n delete pinia.state.value[hotId];\r\n pinia._s.delete(hotId);\r\n }\r\n // save stores in instances to access them devtools\r\n if ((process.env.NODE_ENV !== 'production') &&\r\n IS_CLIENT &&\r\n currentInstance &&\r\n currentInstance.proxy &&\r\n // avoid adding stores that are just built for hot module replacement\r\n !hot) {\r\n const vm = currentInstance.proxy;\r\n const cache = '_pStores' in vm ? vm._pStores : (vm._pStores = {});\r\n cache[id] = store;\r\n }\r\n // StoreGeneric cannot be casted towards Store\r\n return store;\r\n }\r\n useStore.$id = id;\r\n return useStore;\r\n}\n\nlet mapStoreSuffix = 'Store';\r\n/**\r\n * Changes the suffix added by `mapStores()`. Can be set to an empty string.\r\n * Defaults to `\"Store\"`. Make sure to extend the MapStoresCustomization\r\n * interface if you are using TypeScript.\r\n *\r\n * @param suffix - new suffix\r\n */\r\nfunction setMapStoreSuffix(suffix // could be 'Store' but that would be annoying for JS\r\n) {\r\n mapStoreSuffix = suffix;\r\n}\r\n/**\r\n * Allows using stores without the composition API (`setup()`) by generating an\r\n * object to be spread in the `computed` field of a component. It accepts a list\r\n * of store definitions.\r\n *\r\n * @example\r\n * ```js\r\n * export default {\r\n * computed: {\r\n * // other computed properties\r\n * ...mapStores(useUserStore, useCartStore)\r\n * },\r\n *\r\n * created() {\r\n * this.userStore // store with id \"user\"\r\n * this.cartStore // store with id \"cart\"\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @param stores - list of stores to map to an object\r\n */\r\nfunction mapStores(...stores) {\r\n if ((process.env.NODE_ENV !== 'production') && Array.isArray(stores[0])) {\r\n console.warn(`[🍍]: Directly pass all stores to \"mapStores()\" without putting them in an array:\\n` +\r\n `Replace\\n` +\r\n `\\tmapStores([useAuthStore, useCartStore])\\n` +\r\n `with\\n` +\r\n `\\tmapStores(useAuthStore, useCartStore)\\n` +\r\n `This will fail in production if not fixed.`);\r\n stores = stores[0];\r\n }\r\n return stores.reduce((reduced, useStore) => {\r\n // @ts-expect-error: $id is added by defineStore\r\n reduced[useStore.$id + mapStoreSuffix] = function () {\r\n return useStore(this.$pinia);\r\n };\r\n return reduced;\r\n }, {});\r\n}\r\n/**\r\n * Allows using state and getters from one store without using the composition\r\n * API (`setup()`) by generating an object to be spread in the `computed` field\r\n * of a component.\r\n *\r\n * @param useStore - store to map from\r\n * @param keysOrMapper - array or object\r\n */\r\nfunction mapState(useStore, keysOrMapper) {\r\n return Array.isArray(keysOrMapper)\r\n ? keysOrMapper.reduce((reduced, key) => {\r\n reduced[key] = function () {\r\n return useStore(this.$pinia)[key];\r\n };\r\n return reduced;\r\n }, {})\r\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\r\n // @ts-expect-error\r\n reduced[key] = function () {\r\n const store = useStore(this.$pinia);\r\n const storeKey = keysOrMapper[key];\r\n // for some reason TS is unable to infer the type of storeKey to be a\r\n // function\r\n return typeof storeKey === 'function'\r\n ? storeKey.call(this, store)\r\n : store[storeKey];\r\n };\r\n return reduced;\r\n }, {});\r\n}\r\n/**\r\n * Alias for `mapState()`. You should use `mapState()` instead.\r\n * @deprecated use `mapState()` instead.\r\n */\r\nconst mapGetters = mapState;\r\n/**\r\n * Allows directly using actions from your store without using the composition\r\n * API (`setup()`) by generating an object to be spread in the `methods` field\r\n * of a component.\r\n *\r\n * @param useStore - store to map from\r\n * @param keysOrMapper - array or object\r\n */\r\nfunction mapActions(useStore, keysOrMapper) {\r\n return Array.isArray(keysOrMapper)\r\n ? keysOrMapper.reduce((reduced, key) => {\r\n // @ts-expect-error\r\n reduced[key] = function (...args) {\r\n return useStore(this.$pinia)[key](...args);\r\n };\r\n return reduced;\r\n }, {})\r\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\r\n // @ts-expect-error\r\n reduced[key] = function (...args) {\r\n return useStore(this.$pinia)[keysOrMapper[key]](...args);\r\n };\r\n return reduced;\r\n }, {});\r\n}\r\n/**\r\n * Allows using state and getters from one store without using the composition\r\n * API (`setup()`) by generating an object to be spread in the `computed` field\r\n * of a component.\r\n *\r\n * @param useStore - store to map from\r\n * @param keysOrMapper - array or object\r\n */\r\nfunction mapWritableState(useStore, keysOrMapper) {\r\n return Array.isArray(keysOrMapper)\r\n ? keysOrMapper.reduce((reduced, key) => {\r\n // @ts-ignore\r\n reduced[key] = {\r\n get() {\r\n return useStore(this.$pinia)[key];\r\n },\r\n set(value) {\r\n // it's easier to type it here as any\r\n return (useStore(this.$pinia)[key] = value);\r\n },\r\n };\r\n return reduced;\r\n }, {})\r\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\r\n // @ts-ignore\r\n reduced[key] = {\r\n get() {\r\n return useStore(this.$pinia)[keysOrMapper[key]];\r\n },\r\n set(value) {\r\n // it's easier to type it here as any\r\n return (useStore(this.$pinia)[keysOrMapper[key]] = value);\r\n },\r\n };\r\n return reduced;\r\n }, {});\r\n}\n\n/**\r\n * Creates an object of references with all the state, getters, and plugin-added\r\n * state properties of the store. Similar to `toRefs()` but specifically\r\n * designed for Pinia stores so methods and non reactive properties are\r\n * completely ignored.\r\n *\r\n * @param store - store to extract the refs from\r\n */\r\nfunction storeToRefs(store) {\r\n // See https://github.com/vuejs/pinia/issues/852\r\n // It's easier to just use toRefs() even if it includes more stuff\r\n if (isVue2) {\r\n // @ts-expect-error: toRefs include methods and others\r\n return toRefs(store);\r\n }\r\n else {\r\n store = toRaw(store);\r\n const refs = {};\r\n for (const key in store) {\r\n const value = store[key];\r\n if (isRef(value) || isReactive(value)) {\r\n // @ts-expect-error: the key is state or getter\r\n refs[key] =\r\n // ---\r\n toRef(store, key);\r\n }\r\n }\r\n return refs;\r\n }\r\n}\n\n/**\r\n * Vue 2 Plugin that must be installed for pinia to work. Note **you don't need\r\n * this plugin if you are using Nuxt.js**. Use the `buildModule` instead:\r\n * https://pinia.vuejs.org/ssr/nuxt.html.\r\n *\r\n * @example\r\n * ```js\r\n * import Vue from 'vue'\r\n * import { PiniaVuePlugin, createPinia } from 'pinia'\r\n *\r\n * Vue.use(PiniaVuePlugin)\r\n * const pinia = createPinia()\r\n *\r\n * new Vue({\r\n * el: '#app',\r\n * // ...\r\n * pinia,\r\n * })\r\n * ```\r\n *\r\n * @param _Vue - `Vue` imported from 'vue'.\r\n */\r\nconst PiniaVuePlugin = function (_Vue) {\r\n // Equivalent of\r\n // app.config.globalProperties.$pinia = pinia\r\n _Vue.mixin({\r\n beforeCreate() {\r\n const options = this.$options;\r\n if (options.pinia) {\r\n const pinia = options.pinia;\r\n // HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/main/src/apis/inject.ts#L31\r\n /* istanbul ignore else */\r\n if (!this._provided) {\r\n const provideCache = {};\r\n Object.defineProperty(this, '_provided', {\r\n get: () => provideCache,\r\n set: (v) => Object.assign(provideCache, v),\r\n });\r\n }\r\n this._provided[piniaSymbol] = pinia;\r\n // propagate the pinia instance in an SSR friendly way\r\n // avoid adding it to nuxt twice\r\n /* istanbul ignore else */\r\n if (!this.$pinia) {\r\n this.$pinia = pinia;\r\n }\r\n pinia._a = this;\r\n if (IS_CLIENT) {\r\n // this allows calling useStore() outside of a component setup after\r\n // installing pinia's plugin\r\n setActivePinia(pinia);\r\n }\r\n if (USE_DEVTOOLS) {\r\n registerPiniaDevtools(pinia._a, pinia);\r\n }\r\n }\r\n else if (!this.$pinia && options.parent && options.parent.$pinia) {\r\n this.$pinia = options.parent.$pinia;\r\n }\r\n },\r\n destroyed() {\r\n delete this._pStores;\r\n },\r\n });\r\n};\n\nexport { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs };\n","export enum LocalStorageKeys {\n\tTHEME = \"7tv-theme\",\n\tSEASONAL_THEME = \"7tv-seasonal-theme\",\n\tTHEME_TIMESTAMP = \"7tv-theme-timestamp\",\n\tLOCALE = \"7tv-locale\",\n\tIDENTITY = \"7tv-identity\",\n\tDEFAULT_SET = \"7tv-default-set\",\n\tAUTH_TOKEN = \"7tv-auth-token\",\n}\n","export default {\n\tlocale: \"English (United States)\",\n\t// Common / Repeated words and phrases\n\tcommon: {\n\t\tappName: \"7TV\",\n\t\tappHost: \"7tv.app\",\n\t\tsupportEmail: \"kathy{'@'}7tv.app\",\n\t\tlearnMore: \"Learn More\",\n\t\tmore: \"More\",\n\t\tretry: \"Retry\",\n\t\tback: \"Back\",\n\t\tdownload: \"Download | Downloads\",\n\t\tfeatures: \"Features\",\n\t\texperimental: \"Experimental\",\n\t\texperimental_hint: \"This feature is experimental and is not guaranteed to be stable\",\n\t\tcomments: \"Comments\",\n\t\tsearch: \"Search\",\n\t\tupdate: \"Update\",\n\t\treport: \"Report\",\n\t\tdelete: \"Delete\",\n\t\tcancel: \"Cancel\",\n\t\tsubmit: \"Submit\",\n\t\tactivity: \"Activity\",\n\t\tloading: \"Loading\",\n\t\tsave_changes: \"Save Changes\",\n\t\treset: \"Reset\",\n\t\tobject: {\n\t\t\tuser: \"User\",\n\t\t\temote_set: \"Emote Set\",\n\t\t\temote: \"Emote\",\n\t\t},\n\t},\n\t// Text that appears on the home page\n\thome: {\n\t\tslogan: \"The Emote Platform for All\",\n\t\tapp_description: \"Manage hundreds of emotes for your Twitch or YouTube channels with ease\",\n\t\twhy_app: \"Why @:common.appName{'?'}\",\n\t\tdownload_browser: \"Browser Extension\",\n\t\tdownload_mobile: \"Mobile Apps\",\n\t\tdownload_misc: \"Other Apps\",\n\t\tfeatures: {\n\t\t\temote_sets: {\n\t\t\t\tname: \"Emote Sets\",\n\t\t\t\tdetail: \"Group emotes in customizable sets that can be shared with other users or quickly swapped onto your channel.\",\n\t\t\t},\n\t\t\tmany_emote_slots: {\n\t\t\t\tname: \"Hundreds of emote slots\",\n\t\t\t\tdetail: \"Everyone gets 600 customizable channel emote slots, all for free.\",\n\t\t\t},\n\t\t\tchannel_emote_names: {\n\t\t\t\tname: \"Per-channel emote names\",\n\t\t\t\tdetail: \"Don't like the name given to an emote by its author? That's fine, you can change it for your channel only.\",\n\t\t\t},\n\t\t\treal_time: {\n\t\t\t\tname: \"Real-Time\",\n\t\t\t\tdetail: \"Changing emotes in your channel happens instantly, for all viewers. No F5 required.\",\n\t\t\t},\n\t\t\temote_versions: {\n\t\t\t\tname: \"Emote Versioning\",\n\t\t\t\tdetail: \"Swap between themed variants or update an emote to an improved version.\",\n\t\t\t},\n\t\t\tuserbase: {\n\t\t\t\tname: \"Large Community\",\n\t\t\t\tdetail: \"@:common.appName serves {0}+ daily unique users and has a library of over {1} public emotes\",\n\t\t\t},\n\t\t\tnext_gen: {\n\t\t\t\tname: \"Next-gen image formats like WEBP and AVIF\",\n\t\t\t\tdetail: \"We use newer, more optimized image formats to reduce bandwidth usage.\",\n\t\t\t},\n\t\t\tsource_available: {\n\t\t\t\tname: \"Source-Available\",\n\t\t\t\tdetail: \"Our entire codebase is available on GitHub with a source-available license. Anyone can view and contribute.\",\n\t\t\t},\n\t\t},\n\t\tsocials: {\n\t\t\tdiscord: \"Join @:common.appName on Discord\",\n\t\t\tdiscord_online_count: \"{0} online now\",\n\t\t\ttwitter: \"Follow us on Twitter\",\n\t\t\tgithub: \"Contribute\",\n\t\t},\n\t\tlegal: {\n\t\t\tterms: \"Terms of Service\",\n\t\t\tprivacy: \"Privacy Policy\",\n\t\t\tunaffiliated: \"@:common.appName is not affiliated with Twitch Interactive\",\n\t\t},\n\t},\n\t// Nav Bar\n\tnav: {\n\t\thome: \"Home\",\n\t\tabout: \"About\",\n\t\temotes: \"Emotes\",\n\t\tstore: \"Subscribe\",\n\t\tadmin: \"Admin\",\n\t\tsign_in: \"Sign In\",\n\t\tuser_search: \"Search Profiles\",\n\t\ttheme: \"Switch to {0} theme\",\n\t\ttheme_dark: \"Dark\",\n\t\ttheme_light: \"Light\",\n\t\ttheme_seasonal: \"Seasonal\",\n\t\tinbox: \"Inbox\",\n\t\tlocale_selector: \"Language\",\n\t\tlocale_contribute: \"Translate @:common.appName{'!'}\",\n\n\t\twip_notice: {\n\t\t\theading: \"Welcome to the new @:common.appName website\",\n\t\t\ttext1: \"This is an early preview of the next way to experience @:common.appName{'.'}\",\n\t\t\ttext2: \"Explore what's new and give us some feedback! Note it will be undergoing rapid changes and may break frequently.\",\n\t\t},\n\t},\n\tactivity: {\n\t\temote_created: \"Created {T}\",\n\t\temote_renamed: \"Renamed {T} from {O} to {N}\",\n\t\temote_listing_approved: \"Approved {T} for public listing\",\n\t\temote_listing_revoked: \"Removed {T} from public listing\",\n\t\temote_merged: \"Merged {T} into {0}\",\n\t\temote_ownership_transferred: \"Transferred ownership of {T} to {U}\",\n\t\temote_restored: \"Restored {T}\",\n\t\temote_updated: \"Changed properties for {T}\",\n\t\temote_deleted: \"Deleted {T}\",\n\t\temote_tags_updated: \"Set tags for {T}: {N}\",\n\t\temote_processed: \"Executed a new processing job for {T}\",\n\t\temote_version_created: \"Created version '{VER}' for {T}\",\n\t\temote_version_renamed: \"Renamed version '{VER}' for {T} from {1} to {2}\",\n\t\temote_version_approved: \"Approved version '{VER}' for {T} for public listing\",\n\t\temote_version_restored: \"Restored version '{VER}' for {T}\",\n\t\temote_version_deleted: \"Deleted version '{VER}' for {T}\",\n\t\temote_flag_added: \"Added flag {FLAG} to {T}\",\n\t\temote_flag_removed: \"Removed flag {FLAG} from {T}\",\n\t\temote_personal_use_validated: \"Validated personal use for {T}\",\n\t\temote_personal_use_rejected: \"Rejected personal use for {T}\",\n\n\t\tuser_created: \"Created {T}\",\n\t\tuser_deleted: \"Deleted {T}\",\n\t\tuser_editor_added: \"Added {U} as an editor\",\n\t\tuser_editor_added_other: \"Added {U1} as an editor of {U2}\",\n\t\tuser_editor_updated: \"Updated editor privileges for {U}\",\n\t\tuser_editor_updated_other: \"Updated editor privileges for {U1}, an editor of {U2}\",\n\t\tuser_editor_removed: \"Revoked {U}'s editor privileges\",\n\t\tuser_editor_removed_other: \"Revoked {U1}'s editor privileges to {U2}\",\n\t\tuser_banned: \"Banned {T}\",\n\t\tuser_unbanned: \"Unbanned {T}\",\n\t\tuser_updated: \"Changed properties for {T}\",\n\t\tuser_sign_in: \"{T} has signed in\",\n\t\tuser_sign_out: \"{T} has logged out\",\n\t\tuser_forbidden: \"{T} was denied access to {0}\",\n\n\t\temote_set_created: \"Created {T}\",\n\t\temote_set_emote_added: \"Added the emote {AE} to {T}\",\n\t\temote_set_emote_removed: \"Removed the emote {AE} from {T}\",\n\t\temote_set_emote_renamed: \"Renamed the emote {AE} from {O} to {N} in {T}\",\n\t\temote_set_capacity_updated: \"Updated the capacity of {T} from {O} to {N}\",\n\t\temote_set_renamed: \"Renamed the set {T} from {O} to {N}\",\n\t\temote_set_updated: \"Changed properties for {T}\",\n\t},\n\t// Text that is relevant to emotes\n\temote: {\n\t\tadd: \"Add Emote\",\n\t\tauthor: \"Added by\",\n\t\tcreated_at: \"Created\",\n\t\tversions: \"Versions\",\n\t\tpreview_loading: \"Loading previews... {'('}{0}{'/'}{1}{')'}\",\n\t\tpreview_failed: \"Failed to load previews\",\n\t\tprocessing: \"Processing Emote - this may take some time.\",\n\t\tprocessing_failed: \"Processing failed: {0}\",\n\t\tuse: \"Use Emote\",\n\t\tuse_menu: \"Add this emote to...\",\n\t\tswitch_version: \"Switch to this version\",\n\t\tin_n_sets: \"in {0} set | in {0} sets\",\n\t\tdisable: \"Disable Emote\",\n\t\tproperties: \"Properties\",\n\t\tnew_version: \"New Version\",\n\t\treport: \"Report Emote\",\n\t\tPrivacy: \"Privacy\",\n\t\tcomments: \"Comments\",\n\t\tchannels: \"Channels\",\n\t\tcommon_names: \"Other names for this emote\",\n\t\tusage_stats: \"Emote Statistics\",\n\t\tno_longer_available: \"This emote is no longer available\",\n\t\ttags: \"Tags\",\n\t\tadd_tag: \"Add Tag\",\n\t\ttrending_rank: \"#{0} on Trending\",\n\t\tcard_label_added: \"Added to {0}\",\n\t\tcard_label_added_foreign: \"Added to {0}, originating from another set\",\n\t\tavif_no_support:\n\t\t\t\"Sorry, {BROWSER} does not support the AVIF format. Try updating to a newer version or try with a different browser.\",\n\t\tdelete_prompt: {\n\t\t\theading: \"Delete {0}\",\n\t\t\theading_versions: \"Delete version '{0}' of {1}\",\n\t\t\tnotice: \"Are you sure you want to delete the emote {0}{'?'}\",\n\t\t\tnotice_versions: \"Are you sure you want to delete the version '{0}' from {1}{'?'}\",\n\t\t\treason: \"Reason for deletion\",\n\t\t},\n\t\tproperties_prompt: {\n\t\t\theading: \"Edit {0}\",\n\t\t},\n\t\tunlisted: {\n\t\t\theading: \"Heads up!\",\n\t\t\twarning: \"This emote is not publicly listed.\",\n\t\t\twarning_flagged: \"This emote has been unlisted for the following reasons: {FLAG_LIST}\",\n\t\t\tnotice: \"It can be added to your channel, but we cannot verify if it is safe to show on a livestream.\",\n\t\t\tnotice_flagged: \"It can be added to your channel, however we believe it is unsafe to show on a livestream.\",\n\t\t\tshow_button: \"Show Emote\",\n\t\t\tflag_sexual_content: \"Sexual or sexually suggestive content\",\n\t\t\tflag_epilepsy: \"Rapid flashing / seizure-inducing\",\n\t\t\tflag_edgy: \"Edgy or distasteful\",\n\t\t\tflag_twitch_banned: \"Disallowed on Twitch\",\n\t\t},\n\t\tlist: {\n\t\t\tsearching: \"Searching\",\n\t\t\temote_count: \"{0} emote | {0} emotes\",\n\t\t\tno_emotes_listed: \"No emotes found\",\n\t\t\tfetching_slowly: \"Sorry, it seems this is taking a while\",\n\t\t\tcategory: {\n\t\t\t\tname: \"Category\",\n\t\t\t\ttop: \"Top\",\n\t\t\t\ttrending: \"Trending\",\n\t\t\t\tfeatured: \"Featured\",\n\t\t\t\tglobal: \"Global\",\n\t\t\t\tnew: \"New\",\n\t\t\t},\n\t\t\tfilters: {\n\t\t\t\thint: \"Search Filters\",\n\t\t\t\tzero_width: \"Overlaying / Zero-Width\",\n\t\t\t\tanimated: \"Animated\",\n\t\t\t\tcase_sensitive: \"Case Sensitive\",\n\t\t\t\texact_match: \"Exact Match\",\n\t\t\t\tignore_tags: \"Ignore Tags\",\n\t\t\t\tpersonal_use_approved: \"Personal Use Approved\",\n\t\t\t\tsorting: \"Sorting\",\n\t\t\t\tsorting_ascending: \"Ascending\",\n\t\t\t\tsorting_descending: \"Descending\",\n\t\t\t\taspect_ratio: \"Aspect Ratio\",\n\t\t\t\taspect_ratio_format: \"Width to Height\",\n\t\t\t\taspect_ratio_width: \"Ratio Width\",\n\t\t\t\taspect_ratio_height: \"Ratio Height\",\n\t\t\t\taspect_ratio_tolerance: \"Ratio Tolerance %\",\n\t\t\t},\n\t\t},\n\t\tcontext: {\n\t\t\tuse_emote_ellipsis: \"Use Emote...\",\n\t\t\topen_in_new_tab: \"Open in new tab\",\n\t\t\tcopy_emote_link: \"Copy Emote Link\",\n\t\t},\n\t\tupload: {\n\t\t\temote_name: \"Emote Name\",\n\t\t\tversion_name: \"Version Name\",\n\t\t\tversion_description: \"Version Description\",\n\t\t\tsubmit_emote: \"Submit Emote\",\n\t\t\tcreate_emote_version: \"Create Emote Version\",\n\t\t\timage_upload: \"Image Upload\",\n\t\t\taccepted_formats: \"Accepted Formats\",\n\t\t\tfiletype: \"File\",\n\t\t\tanimation: \"Animation\",\n\t\t\ttransparency: \"Transparency\",\n\t\t\temote_details: \"Emote Details\",\n\t\t\tversion_details: \"Version Details\",\n\t\t\tattribution: \"Attribution\",\n\t\t\toriginal_creator: \"Original Creator\",\n\t\t\tas_child: \"You are creating a {IS_DIVERGED} version of {0}. \",\n\t\t\tcontent_moderation: \"Content Moderation\",\n\t\t\thalf_transparency_tooltip:\n\t\t\t\t\"Pixels can only be fully transparent or fully opaque (no variable transparency)\",\n\t\t},\n\t},\n\temote_set: {\n\t\tcreate: \"New @:common.object.emote_set\",\n\t\tselect: \"Select Emote Set\",\n\t\texplain: {\n\t\t\tsection: \"What are Emote Sets?\",\n\t\t\thint: \"Emote Sets are a collection of emotes which can be bound to your channels or shared with other users.\",\n\t\t\thint_select: \"Which Emote Set would you like to use by default?\",\n\t\t\thint_select_emote: \"Where to add {EMOTE}?\",\n\t\t},\n\t\tno_space: \"Slots Full\",\n\t\tnone_selected: \"No Set Selected\",\n\t\tediting: \"Editing {0}\",\n\t\towner: \"{USER}'s Emote Set\",\n\t\towned: \"Owned Emote Set\",\n\t\tmanaged_by: \"Managed by {USER}\",\n\t\tlabel_renamed: \"Renamed\",\n\t\tlabel_conflict: \"Conflict\",\n\t\tlabel_default: \"Default\",\n\t\tlabel_actor: \"Enabled by {0}\", // \"enabled by \"\n\t\tlabel_synced: \"Originates from a different set\",\n\t\tcontext_emote_add: \"Add to {SET_NAME}\",\n\t\tcontext_emote_remove: \"Remove from {SET_NAME}\",\n\t\torigins: {\n\t\t\ttitle: \"Origins\",\n\t\t\thint: \"Synchronize other emote sets to provide base emotes for {0}, useful for managing holiday variants.\",\n\t\t\tnew: \"Add Origin\",\n\t\t\tremove: \"Remove Origin\",\n\t\t\tpriority: \"Priority\",\n\t\t\tpriority_hint: \"This value determines which origin take precedence when dealing with name conflicts\",\n\t\t},\n\t\tpersonal: {\n\t\t\tpersonal_use_guidelines: \"Personal Use Guidelines\",\n\t\t\temote_not_validated:\n\t\t\t\t\"{EMOTE} will need to be checked by a moderator for compliance with the @:emote_set.personal.personal_use_guidelines{'.'}\",\n\t\t\tpending_review: \"Pending Personal Use Review\",\n\t\t\tnot_allowed: \"Not Allowed For Personal Use\",\n\t\t\tallowed: \"Approved For Personal Use\",\n\t\t},\n\t\tmodal: {\n\t\t\tselected_channel_count: \"no channel selected | {0} channel selected | {0} channels selected\",\n\t\t\tcreate_button: \"Create @:common.object.emote_set\",\n\t\t\trename_in_set: \"Rename in {0}\",\n\t\t\tcontext_rename: \"Customize Emote Name\",\n\t\t\tcontext_set_default: \"Assign As Default\",\n\t\t\tcontext_unset_default: \"Unassign As Default\",\n\t\t\tconflict_heading: \"Emote Name Conflict\",\n\t\t\tconflict_notice:\n\t\t\t\t\"{EMOTE} is conflicting with {ACTIVE_EMOTE}. Would you like to replace the conflicting emote?\",\n\t\t\tconflict_button_replace: \"Replace Conflict\",\n\t\t},\n\t\tproperties_prompt: {\n\t\t\theading: \"Modify {0}\",\n\t\t\tname: \"Emote Set Name\",\n\t\t\tcapacity: \"Capacity: {0}\",\n\t\t\tassign_to_channel: \"Assign to channel(s)\",\n\t\t},\n\t\tdelete_prompt: {\n\t\t\theading: \"Delete {0}\",\n\t\t\tnotice: \"Are you sure you want to delete the emote set {0}{'?'} This action is irreversible.\",\n\t\t},\n\t},\n\t// Text that is relevant to users\n\tuser: {\n\t\temote_sets: \"Emote Sets\",\n\t\tno_sets: \"{0} has no emote sets.\",\n\t\tchannel_emotes: \"Channel Emotes\",\n\t\tjoined_at: \"Joined {0}\",\n\t\teditors: \"Editors\",\n\t\troles: \"Roles\",\n\t\tconnections: \"Channels | Channels & Accounts\",\n\t\tnew_connections: \"Link accounts...\",\n\t\tedit_connection: \"Edit Connection\",\n\t\tadd_editor: \"Add Editor\",\n\t\topen_external_profile: \"Open profile (external)\",\n\t\teditor_modal_heading: \"Modify {0}'s Editors\",\n\t\teditor_modal_user_search: \"Who would you like to add as an editor?\",\n\t\teditor_modal_user_update: \"Editor\",\n\t\tno_channel_emotes: \"{0} does not have any emotes on their {1} channel\",\n\t\tno_channels: \"{0} doesn't have any channels connected!\",\n\t\tcard: {\n\t\t\tview_full_profile: \"View Full Profile\",\n\t\t},\n\n\t\tsettings: {\n\t\t\tbutton: \"Edit Profile\",\n\t\t\tsection_profile: \"Profile\",\n\t\t\tusername: \"Username\",\n\t\t\tdisplay_name: \"Display Name\",\n\t\t\tprofile_picture: \"Profile Picture\",\n\t\t\tsection_badges: \"Badges\",\n\t\t\tsection_paints: \"Paints\",\n\t\t\tno_badges: \"You do not own any badges\",\n\t\t\tno_paints: \"You do not own any paints\",\n\t\t\tsign_out: \"Sign Out\",\n\t\t\tcosmetics_updated: \"Cosmetics Updated\",\n\t\t\tcosmetics_updated_message:\n\t\t\t\t\"Your changes will update instantly in chat if you're using the official 7TV Extension.\",\n\t\t\tcosmetics_updated_third_party:\n\t\t\t\t\"If you're using a third-party client such as an add-on in another extension, it may take up to 24 hours.\",\n\t\t},\n\t\teditor_permissions: {\n\t\t\tmodify_emotes: \"Modify Channel Emotes\",\n\t\t\tuse_private_emotes: \"Use Private Emotes\",\n\t\t\tmanage_profile: \"Manage Profile\",\n\t\t\tmanage_owned_emotes: \"Manage Owned Emotes\",\n\t\t\tmanage_emote_sets: \"Manage Emote Sets\",\n\t\t\tmanage_billing: \"Manage Billing\",\n\t\t\tmanage_editors: \"Manage Editors\",\n\t\t\tview_messages: \"View Messages\",\n\t\t},\n\t},\n\tstore: {\n\t\tsubscribe_cta: \"Become a @:common.appName Subscriber!\",\n\t\tsubscribed: \"Thank you for subscribing\",\n\t\tbutton_self: \"Subscribe\",\n\t\tbutton_gift: \"Gift a sub\",\n\n\t\tbilling_information_heading: \"Billing Information\",\n\n\t\tpayment_information_heading: \"Payment Information\",\n\t\tpayment_gift_heading: \"Select the recipient for this gift\",\n\t\tpayment_methods: \"Payment Methods\",\n\t\tpayment_methods_hint: \"Choose a payment method\",\n\t\tpayment_method_paypal: \"PayPal\",\n\t\tpayment_method_stripe: \"Credit Card\",\n\t\tpayment_popup_cta: \"Complete the transaction in the new window\",\n\t\tcheckout_button: \"Checkout\",\n\n\t\tproduct_type_subscription: \"Subscription\",\n\t\tredeem_heading: \"Redeem Gift Code\",\n\t\tredeem_hint: \"Have a special gift code or voucher? Enter it here to redeem it!\",\n\t\tredeem_submit: \"Redeem\",\n\n\t\tpurchase_success: {\n\t\t\theading: \"Purchase Successful\",\n\t\t\ttext1: \"We've received your payment and your subscription has been activated.\",\n\t\t\ttext2: \"Thank you for your support! If you have any questions, please contact us via the methods provided on this page.\",\n\t\t},\n\n\t\tsub: {\n\t\t\tincentive: \"You'll get...\",\n\t\t\tcreator_tier: \"Extras for creators\",\n\t\t\tcreator_tier_desc: \"Upgrade to the Creator tier and get extra coolness for your channel\",\n\n\t\t\tfeature_t1_badge: \"Subscriber Badge\",\n\t\t\tfeature_t1_paints: \"Nametag Paints\",\n\t\t\tfeature_t1_animated_profile_picture: \"Animated Profile Picture\",\n\t\t\tfeature_t1_zero_width: \"Zero Width Emotes\",\n\t\t\tfeature_t1_global_raffle: \"Global Emote Raffle Ticket\",\n\t\t\tfeature_t1_upload_priority: \"Emote Upload Priority\",\n\t\t\tfeature_t1_personal_emotes: \"Personal Emotes\",\n\t\t\tfeature_t2_animated_profile_banner: \"Animated Profile Banner\",\n\t\t\tfeature_t2_animated_offline_screen: \"Animated Offline Screen\",\n\t\t\tfeature_t2_custom_chat_theme: \"Custom Chat Theme\",\n\t\t\tfeature_t2_extended_sub_emotes: \"Extended Sub Emotes\",\n\t\t\tcurrent_plan: \"Your Plan\",\n\n\t\t\tcancel: \"Do Not Renew\",\n\t\t\tupdate_payment: \"Update Payment Method\",\n\t\t\treactivate: \"Reactivate Subscription\",\n\t\t\tcancel_prompt: \"Are you sure you want to cancel your subscription?\",\n\n\t\t\tstate_heading: \"Your Subscription\",\n\t\t\tstate_badge_heading: \"Subscriber Badges\",\n\t\t\tstate_badge_progress: \"Badge Progress\",\n\t\t\tstate_badge_progress_filled: \"You'll receive your {0} badge shortly\",\n\t\t\tstate_badge_edit_button: \"Manage Badges\",\n\t\t\tstate_paints: \"Paints\",\n\t\t\tstate_anniversary:\n\t\t\t\t\"Your Sub anniversary is today | Your next anniversary is in {0} day | Your next Sub anniversary is in {0} days\",\n\t\t\tstate_age:\n\t\t\t\t\"You subscribed today | You've been subscribed for {0} day | You've been subscribed for {0} days\",\n\t\t\tstate_gift: \"You were gifted a sub by {USER}\",\n\t\t\tstate_ending: \"Your sub ends today | Your sub ends in {0} day | Your sub ends in {0} days\",\n\t\t\tstate_collection_heading: \"Collection\",\n\t\t\tstate_paints_heading:\n\t\t\t\t\"You don't have any paints yet | You've unlocked {0} paint so far | You've unlocked {0} paints so far\",\n\t\t\tstate_paints_current: \"Paints Available Now\",\n\t\t\tstate_paints_hint: \"New Paints are released on a monthly basis!\",\n\t\t\tstate_paints_edit_button: \"Manage Paints\",\n\t\t\tstate_raffle: \"Global Emote Raffle\",\n\t\t\tstate_leaderboards: \"Top Gifters\",\n\n\t\t\traffle: {\n\t\t\t\tstarts_at: \"{0} days\",\n\t\t\t\tstarts_at_hint: \"The next sub raffle begins on {0}\",\n\t\t\t},\n\t\t},\n\t},\n\t// Text that is relating to the reporting system\n\treporting: {\n\t\treport: \"Report\",\n\t\temote_reason: {\n\t\t\ti_made_this: \"I made this emote but it was uploaded by someone else\",\n\t\t\tduplicate: \"This emote is a duplicate\",\n\t\t\tpornographic: \"This emote contains pornographic or overly sexualized imagery\",\n\t\t\tviolence_gore: \"This emote displays extreme violence or gore\",\n\t\t\ti_appear_there: \"This emote depicts me and I don't like it\",\n\t\t\toffensive: \"I find this emote offensive\",\n\t\t\tother: \"Something else\",\n\t\t},\n\t\tuncategorized_prompt: \"What's the matter?\",\n\t\tdetails: \"Details (additional info and/or evidence for your report)\",\n\t\tsuccess: \"Report submitted successfully\",\n\t\tnotify: \"You will be notified via the inbox once your report is handled or further information is requested.\",\n\t\tcomplete_step_one: \"Continue\",\n\t\tabuse_notice: \"Abuse of the report feature may lead to your access being revoked.\",\n\t},\n\t// Text that is relating to the provider migration tool\n\tmigrate: {\n\t\tcta: \"Migrate to @:common.appName\",\n\t\theading: \"Migrate Your Emotes to @:common.appName\",\n\t\tpitch: \"Automatically move your emotes from other providers to @:common.appName and benefit from the simplicity of our platform!\",\n\t\tselect_providers: \"Which providers would you like to import from?\",\n\t},\n\t// Text that is relevant to the inbox\n\tinbox: {\n\t\tinbox: \"Inbox\",\n\t\ttabs: {\n\t\t\tall: \"All Messages\",\n\t\t\tunread: \"Unread\",\n\t\t\timportant: \"Important\",\n\t\t},\n\t\tunread_tag: \"Unread\",\n\t\t// System inbox messages\n\t\tgeneric: {\n\t\t\temote_listed: {\n\t\t\t\tsubject: \"Emote Approved for Listing\",\n\t\t\t\tcontent: `\n# Your emote \"{EMOTE_NAME}\" was approved for listing \\n\nIt will now be available on the Emote Directory and begin appearing on @:common.appHost{'.'}\n`,\n\t\t\t},\n\t\t\temote_not_listed: {\n\t\t\t\tsubject: \"Emote Not Approved for Listing\",\n\t\t\t\tcontent: `\n# Your emote \"{EMOTE_NAME}\" was rejected\nIt will not be available via the public Emote Directory or visible on @:common.appHost,\nbut will remain available for users with the link.\n`,\n\t\t\t},\n\t\t\temote_ownership_claim_request: {\n\t\t\t\tsubject: \"Invitation to claim ownership of an emote\",\n\t\t\t\tcontent: `\n## {OWNER_DISPLAY_NAME} wants you to become the owner of '{EMOTE_NAME}'\n\n[View Emote]({EMOTE_URL})\n\n**[Accept Request]({EMOTE_CLAIM_URL})** | [Decline Request]({EMOTE_DECLINE_URL})\n\t\t\t\t`,\n\t\t\t},\n\t\t\tclient_banned: {\n\t\t\t\tsubject: \"You've been banned\",\n\t\t\t\treason: {\n\t\t\t\t\tpornographic_content: \"\",\n\t\t\t\t},\n\t\t\t\tcontent: `\n# Account Banned\nYour access to @:common.appName is now limited.

\n### Reason for this action\n{BAN_REASON}

\n### Restrictions Applied
\n{EFFECT_NO_PERMISSIONS}\n{EFFECT_NO_AUTH}\n{EFFECT_NO_OWNERSHIP}\n{EFFECT_MEMORY_HOLE}\n\n
This decision expires **{BAN_EXPIRE_AT}**.\n_If you believe this is a mistake, please email @:common.supportEmail{'.'}_\n`,\n\t\t\t\teffect: {\n\t\t\t\t\tno_permissions: \"* You may no longer interact with the app\",\n\t\t\t\t\tno_auth: \"* You may no longer sign in\",\n\t\t\t\t\tno_ownership: \"* Any content you created will no longer be available\",\n\t\t\t\t\tmemory_hole: \"* You won't be visible to other users\",\n\t\t\t\t\tip_blocked: \"* Your IP is blocked from accessing all @:common.appName services\",\n\t\t\t\t},\n\t\t\t},\n\t\t\treport_closed: {\n\t\t\t\tsubject: \"Report closed\",\n\t\t\t\tcontent: `\nThank you for notifying us, your report {'#'}{CASE_ID} has been handled.\n\t\t\t\t`,\n\t\t\t},\n\t\t},\n\t},\n\t// 404 Messages\n\tnotFound: {\n\t\ttroll_despair: \"We couldn't find it\",\n\t\tdoctor_wtf: \"The hell's this?\",\n\t\tpot_friend: \"I'm a pot, friend\",\n\t},\n};\n","export default {\n\taf_ZA: {\n\t\thash: \"14e49a99eb1e758d5e6da8043f43f7bb116d321957d2d559f1f37b65f21e2bb0\",\n\t\tname: \"Afrikaans (Suid-Afrika)\",\n\t},\n\tar_SA: { hash: \"2b81abcc4d6329e518fd5197df535ea8f78d3b0f7af052c266937586086eb0ba\", name: \"اللغة العربية\" },\n\tbe_BY: { hash: \"0293d7571b5b65a55d2ecb7b14a3e1b03fe57a2d1b0f93387ab9dc5b3fbf43e3\", name: \"Беларускі (Беларусь)\" },\n\tbg_BG: {\n\t\thash: \"ae8f5bad824ed5c3d191cef3d06ff06ddf65c9531df301ca793e26aaf7bf4d6b\",\n\t\tname: \"English (United States)\",\n\t},\n\tca_ES: { hash: \"d9e93b134ebaf80af9b8a7d36ae5b253a3049789d0b504beb1de13ae4d7e3403\", name: \"Català (Catalunya)\" },\n\tcs_CZ: { hash: \"e1a16436805345c6800704cc1dfc3322f67fac6c22c64258f0242435843f75c7\", name: \"Čeština (Česko)\" },\n\tda_DK: { hash: \"7db9b77335e8c9e2d809ae1d9a66ab31e0678db0c77313a69f4de480f2672333\", name: \"Dansk (Danmark)\" },\n\tde_AT: { hash: \"791330385b3183b18300b7b7988d7d5c3f6cb0cee7c182517d4b966569377b06\", name: \"Deitsch (Österreich)\" },\n\tde_DE: { hash: \"f0dbbc9f7219b59af8fd76d94c687d91df7649fdf4b83dc2f1cde1d2eb94c8e7\", name: \"Deutsch (Deutschland)\" },\n\tel_GR: { hash: \"e600edf33746e64a00ee676811b1c852990fbc219b71e14b24c03a0319397dcd\", name: \"Ελληνικά (Ελλάδα)\" },\n\ten_GB: {\n\t\thash: \"35b2802642f0d4d54e2b236d1e7fe48d77f8039cb9ccbfa59d53d35ce4b1bd10\",\n\t\tname: \"English (United Kingdom)\",\n\t},\n\ten_PT: { hash: \"ca951543acf9b9e2dde121039714b5c6a2f9d217c53b326cd5a4a3d2b81190fa\", name: \"English (Pirate)\" },\n\ten_US: {\n\t\thash: \"f06acbb1c37df2a754f2d7de9460d3b0e653f5bbbc830ea87475869c54ace08b\",\n\t\tname: \"English (United States)\",\n\t},\n\tes_419: { hash: \"fc996e46864a65e5415239784192f6b64cb51fc019d06d1ee6040bfdaf261687\", name: \"Español (Latino)\" },\n\tes_ES: { hash: \"a38da12a298e7b7caf367f6cf8a834c37a1734f864551fc990e0f08aa485fbe7\", name: \"Español (España)\" },\n\tet_EE: { hash: \"4359f8f78743230d43e590a779f4c1ff7d94a5f6fc87f8602682bcdf5b9b0342\", name: \"Eesti keel (Eesti)\" },\n\tfa_IR: { hash: \"79584ce90a48c8570713706dac70a93caac10d75b450953c6ea2ce9d06d4c036\", name: \"فارسی\" },\n\tfi_FI: { hash: \"ec16351751d3a46df7603cb98f4b9acd954c39dea30567822289039f793f3f7a\", name: \"Suomi (Suomi)\" },\n\tfr_FR: { hash: \"03d0e52eec9743eb1a94be547caff048b1666d1c7734bf7656a0565e82410cfa\", name: \"Français (France)\" },\n\tga_IE: { hash: \"fd0e21f70ca4a1907a1d8c420d0ff3ffcae88d8949507476c7bf486a029de79f\", name: \"Gaeilge (Éireann)\" },\n\the_IL: { hash: \"5d3801be54856ba7a148705610c6320a8b2cdfe8f29a39cb53c395fc9fdf8182\", name: \"עברית (ישראל)\" },\n\thi_IN: {\n\t\thash: \"ae8f5bad824ed5c3d191cef3d06ff06ddf65c9531df301ca793e26aaf7bf4d6b\",\n\t\tname: \"English (United States)\",\n\t},\n\thu_HU: { hash: \"e5dbdab558a57f40e4d722341caca9e030f70327223f3d67a888eb0fd9d04e4f\", name: \"Magyar (Magyarország)\" },\n\tit_IT: { hash: \"c9a0f9f62a2264c39b025033de3dd6717760039710383f016f83b2f706ca9ae6\", name: \"Italiano (Italia)\" },\n\tja_JP: { hash: \"5cdfd05ce83f5e3d16d393f53ba2ce0a0e3fb7c70c20cddfa4806b3e5ee4044d\", name: \"日本語 (日本)\" },\n\tka_GE: { hash: \"93f07cfa6aa1c839af3b43e26619eddb56ddc06dc13e5d7678437b0a47c04f9a\", name: \"ქართული (საქართველო)\" },\n\tkk_KZ: { hash: \"3bc969810826679148908648c5caabfe84606fd5aa17ff655aa001cca01e4d80\", name: \"Қазақ тілі (Қазақстан)\" },\n\tko_KR: { hash: \"d537c154cad63caaf9bcd946bc716a93783494bd52a11c686dcba4a6702d66f2\", name: \"한국어 (대한민국)\" },\n\tnb_NO: { hash: \"27f3f1d7addfd6d1619b2e12ed2f88ff21a51563fcb712ecc78f50f5a7ee8e00\", name: \"Norsk bokmål (Norge)\" },\n\tnl_NL: { hash: \"ea737298927e2cacb8db8c1fbeb033299dfb7f5a08c1663d9e32abbfdf5d0c00\", name: \"Nederlands (Nederland)\" },\n\tnn_NO: { hash: \"469024778b949b3e8c48e5789a60a35551407167d40b03163a4c054bb42882ee\", name: \"Norsk nynorsk (Noreg)\" },\n\tpl_PL: { hash: \"1d6df98313991b1039b9272d99d3da10f8dd046ee81bcb3c942abe66a72e03dc\", name: \"Polski (Polska)\" },\n\tpt_BR: { hash: \"0bffad7de35d78bed6d3fd4bb3db807c3ed2b00df271f59e6efca7d23c159ddc\", name: \"Português (Brasil)\" },\n\tpt_PT: { hash: \"2a494034c22245a4cbda925c5bfb9d0265ea02f48cc32bbf290e46d6578647c8\", name: \"Português (Portugal)\" },\n\tro_RO: { hash: \"f11a7979a76aec58c4acf460c636fc156e49281fe1a986416c4913788eb15671\", name: \"Română (România)\" },\n\tru_RU: { hash: \"f5e8cda57326eca949389795bba05f6458d5473dc8a98ffe91e0f85e4ac96528\", name: \"Русский (Россия)\" },\n\tsq_AL: { hash: \"3ac165fe4ba68c06c29b7cbd8474816dac6e49fe09ef1a5f029ec0a1491009ec\", name: \"Shqip (Shqipëri)\" },\n\tsr_SP: { hash: \"e8a70ca389e7cb3679f1eb01d6e0e6f670298ad68ff7d1c4d69823a7714e33fb\", name: \"Српски (Србија)\" },\n\tsv_SE: { hash: \"4f26ed36b4c5ed37b7b41f4bc21fc9e3902ba3e0fc8137b8a565dfcf52ffac95\", name: \"Svenska (Sverige)\" },\n\tth_TH: {\n\t\thash: \"ae8f5bad824ed5c3d191cef3d06ff06ddf65c9531df301ca793e26aaf7bf4d6b\",\n\t\tname: \"English (United States)\",\n\t},\n\ttr_TR: { hash: \"e7a77161b7581092ca704b22f13cdf44b9fa01ea79387e8bdf2c34502a85c3c6\", name: \"Türkçe (Türkiye)\" },\n\tuk_UA: { hash: \"081f95776bdfae85c01ca6631c5677f1310f3a8954246dcb49da8006261c68ca\", name: \"Українська (Україна)\" },\n\tvi_VN: { hash: \"21678b7c971af5587e2fee1373e879559e4ac309ba5d5870887dbfe890ad0305\", name: \"Tiếng Việt (Việt Nam)\" },\n\tzh_CN: {\n\t\thash: \"ae8f5bad824ed5c3d191cef3d06ff06ddf65c9531df301ca793e26aaf7bf4d6b\",\n\t\tname: \"English (United States)\",\n\t},\n\tzh_TW: {\n\t\thash: \"ae8f5bad824ed5c3d191cef3d06ff06ddf65c9531df301ca793e26aaf7bf4d6b\",\n\t\tname: \"English (United States)\",\n\t},\n} as { [key: string]: { hash: string; name: string } };\n","import { createI18n } from \"vue-i18n\";\nimport { LocalStorageKeys } from \"@store/lskeys\";\nimport en_US from \"@locale/en_US\";\nimport manifest from \"@locale/manifest\";\n\nconst localeWL = import.meta.env.VITE_APP_LOCALES?.split(\",\") ?? [];\nexport const options = Object.keys(manifest)\n\t.filter((k) => k !== \"type\" && localeWL.includes(k))\n\t.reduce((m, v) => {\n\t\tm[v] = manifest[v].name;\n\t\treturn m;\n\t}, {} as { [key: string]: string });\n\nconst getBrowserLocale = () => {\n\tlet locale: string;\n\tconst setting = localStorage.getItem(LocalStorageKeys.LOCALE);\n\tif (setting) {\n\t\tlocale = setting;\n\t} else {\n\t\tconst navigatorLocale = navigator.languages !== undefined ? navigator.languages[0] : navigator.language;\n\n\t\tif (!navigatorLocale) {\n\t\t\treturn \"en_US\";\n\t\t}\n\n\t\tlocale = navigatorLocale;\n\t}\n\n\tlocale = locale.trim().replace(\"-\", \"_\").toLowerCase();\n\tif (!(locale in options)) {\n\t\treturn \"en_US\";\n\t}\n\n\treturn locale;\n};\n\nconst l = getBrowserLocale();\n\nexport const i18n = createI18n({\n\tlegacy: false,\n\tglobalInjection: true,\n\tlocale: l,\n\tfallbackLocale: \"en_US\",\n\tsilentTranslationWarn: !import.meta.env.DEV,\n\tsilentFallbackWarn: !import.meta.env.DEV,\n\twarnHtmlMessage: import.meta.env.DEV,\n\tmessages: {\n\t\ten_US,\n\t},\n});\n\nexport const correctLocale = (locale: string) => {\n\tconst splits = locale.split(\"_\");\n\tif (splits.length < 2) {\n\t\tsplits[0] = \"en\";\n\t\tsplits[1] = \"US\";\n\t}\n\n\treturn `${splits[0]}_${splits[1].toUpperCase()}`;\n};\n","import { defineStore } from \"pinia\";\nimport { LocalStorageKeys } from \"@store/lskeys\";\nimport { correctLocale } from \"@/i18n\";\nimport { EmoteSet } from \"@/structures/EmoteSet\";\nimport { Role } from \"@/structures/Role\";\n\nexport interface State {\n\trefreshAuth: boolean;\n\tauthToken: string | null;\n\ttheme: Theme;\n\tseasonalTheme: boolean;\n\tthemeTimestamp: number;\n\tlastChange: number;\n\tnotFoundMode: NotFoundMode | null;\n\tnavOpen: boolean;\n\tnoTransitions: boolean;\n\tnamedSets: {\n\t\tglobal: [EmoteSet | null, Record];\n\t};\n\troles: Record;\n\tlocale: string;\n\tfaPro: boolean;\n}\n\nconst getBrowserLocale = () => {\n\tconst navigatorLocale = navigator.languages !== undefined ? navigator.languages[0] : navigator.language;\n\n\tif (!navigatorLocale) {\n\t\treturn undefined;\n\t}\n\n\treturn navigatorLocale.trim().replace(\"-\", \"_\").toLowerCase();\n};\n\nexport const useStore = defineStore(\"main\", {\n\tstate: () =>\n\t\t({\n\t\t\trefreshAuth: true,\n\t\t\tauthToken: window.localStorage.getItem(LocalStorageKeys.AUTH_TOKEN) || null,\n\t\t\ttheme: (localStorage.getItem(LocalStorageKeys.THEME) || \"dark\") as Theme,\n\t\t\tseasonalTheme: false,\n\t\t\tthemeTimestamp: parseInt(localStorage.getItem(LocalStorageKeys.THEME_TIMESTAMP ?? \"0\") as string),\n\t\t\tlocale: correctLocale(localStorage.getItem(LocalStorageKeys.LOCALE) || getBrowserLocale() || \"en_US\"),\n\t\t\tlastChange: 0,\n\t\t\tnotFoundMode: null,\n\t\t\tnavOpen: false,\n\t\t\tnoTransitions: false,\n\t\t\tnamedSets: {\n\t\t\t\tglobal: [null, {}],\n\t\t\t},\n\t\t\troles: {},\n\t\t\tfaPro: import.meta.env.VITE_APP_FA_PRO === \"true\",\n\t\t} as State),\n\tgetters: {\n\t\tgetTheme: (state) => state.theme as Theme,\n\t\tgetLastChange: (state) => state.lastChange,\n\t\tgetNotFoundMode: (state) => state.notFoundMode,\n\t\tgetNavOpen: (state) => state.navOpen,\n\t\tgetNoTransitions: (state) => state.noTransitions,\n\t\troleList: (state): Role[] => Object.keys(state.roles).map((k) => state.roles[k]),\n\t},\n\tactions: {\n\t\tsetAuthToken(token: string | null, refresh = true) {\n\t\t\tthis.authToken = token;\n\t\t\tthis.refreshAuth = refresh;\n\t\t\tif (token) {\n\t\t\t\tlocalStorage.setItem(LocalStorageKeys.AUTH_TOKEN, token);\n\t\t\t} else {\n\t\t\t\tlocalStorage.removeItem(LocalStorageKeys.AUTH_TOKEN);\n\t\t\t}\n\t\t},\n\t\tsetTheme(newTheme: Theme) {\n\t\t\tconst now = Date.now();\n\t\t\tthis.noTransitions = true;\n\t\t\tlocalStorage.setItem(LocalStorageKeys.THEME, newTheme);\n\n\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\tthis.lastChange = now;\n\t\t\t\tthis.theme = newTheme;\n\t\t\t\twindow.requestAnimationFrame(() => {\n\t\t\t\t\tthis.noTransitions = false;\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.setThemeTimestamp(Date.now());\n\t\t},\n\t\tsetSeasonalTheme(value: boolean) {\n\t\t\tthis.seasonalTheme = value;\n\t\t\tlocalStorage.setItem(LocalStorageKeys.SEASONAL_THEME, String(value));\n\t\t\tthis.setThemeTimestamp(Date.now());\n\t\t},\n\t\tsetThemeTimestamp(value: number) {\n\t\t\tthis.themeTimestamp = value;\n\t\t\tlocalStorage.setItem(LocalStorageKeys.THEME_TIMESTAMP, String(value));\n\t\t},\n\t\tsetNotFoundMode(newMode: NotFoundMode | null) {\n\t\t\tthis.notFoundMode = newMode;\n\t\t},\n\t\tsetNavOpen(newNavOpen: boolean) {\n\t\t\tthis.navOpen = newNavOpen;\n\t\t},\n\t\tsetGlobalEmoteSet(set: EmoteSet) {\n\t\t\tthis.namedSets.global[0] = set;\n\t\t\tthis.namedSets.global[1] = set.emotes.map((ae) => ({ [ae.id]: true })).reduce((a, b) => ({ ...a, ...b }));\n\t\t},\n\t\tsetRoleList(roles: Role[]) {\n\t\t\tthis.roles = roles.map((r) => ({ [r.id]: r })).reduce((a, b) => ({ ...a, ...b }));\n\t\t},\n\t\tsetLocale(newLocale: string) {\n\t\t\tnewLocale = correctLocale(newLocale);\n\t\t\tthis.locale = newLocale;\n\t\t\tlocalStorage.setItem(LocalStorageKeys.LOCALE, newLocale);\n\t\t},\n\t},\n});\n\nsetInterval(() => {\n\tconst token = localStorage.getItem(LocalStorageKeys.AUTH_TOKEN);\n\tconst store = useStore();\n\tif (token !== store.authToken) {\n\t\tstore.setAuthToken(token);\n\t}\n}, 1000);\n\nexport type Theme = \"light\" | \"dark\";\nexport type NotFoundMode = \"troll-despair\" | \"pot-friend\";\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const AdminRoute = {\n\tpath: \"/admin\",\n\tname: \"Admin\",\n\tmeta: { transition: \"fade\" },\n\tcomponent: () => import(\"@/views/admin/Admin.vue\"),\n\tchildren: [\n\t\t{\n\t\t\tpath: \"reports\",\n\t\t\tmeta: { transition: \"fade\", transitionMode: \"out-in\" },\n\t\t\tcomponent: () => import(\"@/views/context/AdminReportContext.vue\"),\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: \"\",\n\t\t\t\t\tname: \"AdminReports\",\n\t\t\t\t\tcomponent: () => import(\"@/views/admin/AdminReports.vue\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpath: \":report\",\n\t\t\t\t\tname: \"AdminReportEditor\",\n\t\t\t\t\tmeta: { transition: \"fade\", requestEmoteContext: true },\n\t\t\t\t\tcomponent: () => import(\"@/views/admin/AdminReportEditor.vue\"),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: \"modq\",\n\t\t\tname: \"AdminModQueue\",\n\t\t\tmeta: { transition: \"fade\", transitionMode: \"out-in\" },\n\t\t\tcomponent: () => import(\"@/views/admin/ModQueue/AdminModQueue.vue\"),\n\t\t},\n\t\t{ path: \"users\", component: () => import(\"@/views/admin/AdminUsers.vue\") },\n\t\t{\n\t\t\tpath: \"roles\",\n\t\t\tname: \"AdminRoles\",\n\t\t\tmeta: { transition: \"fade\" },\n\t\t\tcomponent: () => import(\"@/views/admin/AdminRoles.vue\"),\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tpath: \":roleID\",\n\t\t\t\t\tcomponent: () => import(\"@/views/admin/AdminRoleEditor.vue\"),\n\t\t\t\t\tprops: true,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tpath: \"cosmetics\",\n\t\t\tname: \"AdminCosmetics\",\n\t\t\tmeta: { transition: \"fade\" },\n\t\t\tcomponent: () => import(\"@/views/admin/AdminCosmetics.vue\"),\n\t\t},\n\t\t{\n\t\t\tpath: \"bans\",\n\t\t\tname: \"AdminBans\",\n\t\t\tmeta: { transition: \"fade\" },\n\t\t\tcomponent: () => import(\"@/views/admin/AdminBans.vue\"),\n\t\t},\n\t],\n} as RouteRecordRaw;\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const ExtensionAuthRoute = {\n\tpath: \"/extension/auth\",\n\tname: \"ExtensionAuth\",\n\tcomponent: () => import(\"@/views/ExtensionAuth.vue\"),\n} as RouteRecordRaw;\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const CallbackRoute = [\n\t{\n\t\tpath: \"/auth/callback\",\n\t\tname: \"OAuth2Callback\",\n\t\tcomponent: () => import(\"@/views/OAuth2.vue\"),\n\t},\n] as RouteRecordRaw[];\n","import { watch } from \"vue\";\nimport { RouteRecordRaw } from \"vue-router\";\nimport { storeToRefs } from \"pinia\";\nimport { useStore } from \"@/store/main\";\n\nexport const EmoteSetRoute = {\n\tpath: \"/emote-sets/:setID\",\n\tname: \"EmoteSet\",\n\tprops: true,\n\tbeforeEnter(to, from, next) {\n\t\t// global set permalink\n\t\tif (to.params.setID === \"global\") {\n\t\t\tconst { namedSets } = storeToRefs(useStore());\n\n\t\t\tconst ok = watch(\n\t\t\t\tnamedSets.value.global,\n\t\t\t\t(val) => {\n\t\t\t\t\tif (!val[0]) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tnext({ name: \"EmoteSet\", params: { setID: val[0].id } });\n\t\t\t\t\tok();\n\t\t\t\t},\n\t\t\t\t{ immediate: true },\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tnext();\n\t},\n\tcomponent: () => import(\"@/views/emote-set/EmoteSetPage.vue\"),\n} as RouteRecordRaw;\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const EmotesRoute = [\n\t{\n\t\tpath: \"/emotes\",\n\t\tname: \"Emotes\",\n\t\tcomponent: () => import(\"@/views/context/EmoteContext.vue\"),\n\t\tchildren: [\n\t\t\t{\n\t\t\t\tpath: \"\",\n\t\t\t\tname: \"EmoteList\",\n\t\t\t\tmeta: { transition: \"zoom\" },\n\t\t\t\tcomponent: () => import(\"@/views/emote-list/EmoteList.vue\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/emotes/:emote\",\n\t\t\t\tmeta: { transition: \"zoom\", requestEmoteContext: true },\n\t\t\t\tprops: true,\n\t\t\t\tname: \"Emote\",\n\t\t\t\tcomponent: () => import(\"@/views/emote/EmoteRoot.vue\"),\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tpath: \"/emotes/create\",\n\t\tname: \"EmoteUpload\",\n\t\tprops: true,\n\t\tcomponent: () => import(\"@/views/emote-upload/EmoteUpload.vue\"),\n\t},\n] as RouteRecordRaw[];\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const HelpRoute = {\n\tpath: \"/help\",\n\tname: \"Help\",\n\tcomponent: () => import(\"@/views/help/Help.vue\"),\n\tchildren: [\n\t\t{\n\t\t\tpath: \"kick\",\n\t\t\tname: \"HelpKick\",\n\t\t\tmeta: { title: \"Enable 7TV on kick.com\", transparentNav: true },\n\t\t\tcomponent: () => import(\"@/views/help/HelpKick.vue\"),\n\t\t},\n\t],\n} as RouteRecordRaw;\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const HomeRoute = {\n\tpath: \"/\",\n\tname: \"Home\",\n\tmeta: { transparentNav: true },\n\tcomponent: () => import(\"@/views/home/Home.vue\"),\n} as RouteRecordRaw;\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const LegalRoute = [\n\t{\n\t\tpath: \"/legal/privacy\",\n\t\tname: \"LegalPrivacy\",\n\t\tmeta: { transition: \"zoom\" },\n\t\tcomponent: () => import(\"@/views/legal/LegalPrivacy.vue\"),\n\t},\n\t{\n\t\tpath: \"/legal/terms\",\n\t\tname: \"LegalTerms\",\n\t\tprops: true,\n\t\tcomponent: () => import(\"@/views/legal/LegalTerms.vue\"),\n\t},\n] as RouteRecordRaw[];\n","import { RouteRecordRaw } from \"vue-router\";\n\nexport const StoreRoute = {\n\tpath: \"/store\",\n\talias: \"/subscribe\",\n\tname: \"Store\",\n\tmeta: { transparentNav: true },\n\tcomponent: () => import(\"@/views/store/Store.vue\"),\n\tchildren: [\n\t\t{\n\t\t\tpath: \"purchase\",\n\t\t\tname: \"StorePurchase\",\n\t\t\tprops: true,\n\t\t\tmeta: { transparentNav: true },\n\t\t\tcomponent: () => import(\"@/views/store/StorePurchase.vue\"),\n\t\t},\n\t\t{\n\t\t\tpath: \"redeem\",\n\t\t\tname: \"StoreRedeem\",\n\t\t\tmeta: { transparentNav: true },\n\t\t\tcomponent: () => import(\"@/views/store/StoreRedeem.vue\"),\n\t\t},\n\t\t{\n\t\t\tpath: \"complete\",\n\t\t\tcomponent: () => null,\n\t\t\tbeforeEnter: (to, _, next) => {\n\t\t\t\tif (!window.opener) {\n\t\t\t\t\tnext({ name: \"Store\" }); // no parent window, act like normal site\n\t\t\t\t}\n\n\t\t\t\tconst id = window.name.split(\":\")[1];\n\t\t\t\tif (!id) {\n\t\t\t\t\tnext({ name: \"Store\" }); // no window id\n\t\t\t\t}\n\n\t\t\t\t// Send data to the parent window\n\t\t\t\twindow.opener.postMessage(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tstatus: \"COMPLETE\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t}),\n\t\t\t\t\t\"*\",\n\t\t\t\t);\n\n\t\t\t\t// Callback complete, close the window\n\t\t\t\twindow.close();\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: \"cancel\",\n\t\t\tbeforeEnter: (to, _, next) => {\n\t\t\t\tif (!window.opener) {\n\t\t\t\t\tnext({ name: \"Store\" }); // no parent window, act like normal site\n\t\t\t\t}\n\n\t\t\t\tconst id = window.name.split(\":\")[1];\n\t\t\t\tif (!id) {\n\t\t\t\t\tnext({ name: \"Store\" }); // no window id\n\t\t\t\t}\n\n\t\t\t\t// Send data to the parent window\n\t\t\t\twindow.opener.postMessage(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tstatus: \"CANCEL\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t}),\n\t\t\t\t\t\"*\",\n\t\t\t\t);\n\n\t\t\t\t// Callback complete, close the window\n\t\t\t\twindow.close();\n\t\t\t},\n\t\t},\n\t],\n} as RouteRecordRaw;\n","import gql from \"graphql-tag\";\nimport { Badge, Paint } from \"@/structures/Cosmetic\";\n\nexport const GetCosmetics = gql`\n\tquery GetCosmestics($list: [ObjectID!]) {\n\t\tcosmetics(list: $list) {\n\t\t\tpaints {\n\t\t\t\tid\n\t\t\t\tkind\n\t\t\t\tname\n\t\t\t\tfunction\n\t\t\t\tcolor\n\t\t\t\tangle\n\t\t\t\tshape\n\t\t\t\timage_url\n\t\t\t\trepeat\n\t\t\t\tstops {\n\t\t\t\t\tat\n\t\t\t\t\tcolor\n\t\t\t\t}\n\t\t\t\tshadows {\n\t\t\t\t\tx_offset\n\t\t\t\t\ty_offset\n\t\t\t\t\tradius\n\t\t\t\t\tcolor\n\t\t\t\t}\n\t\t\t}\n\t\t\tbadges {\n\t\t\t\tid\n\t\t\t\tkind\n\t\t\t\tname\n\t\t\t\ttooltip\n\t\t\t\ttag\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport interface GetCosmetics {\n\tcosmetics: {\n\t\tpaints: Paint[];\n\t\tbadges: Badge[];\n\t};\n}\n\nexport const PaintFragment = gql`\n\tfragment PaintFragment on CosmeticPaint {\n\t\tid\n\t\tname\n\t\tfunction\n\t\tcolor\n\t\tangle\n\t\tshape\n\t\timage_url\n\t\trepeat\n\t\tstops {\n\t\t\tat\n\t\t\tcolor\n\t\t}\n\t\tshadows {\n\t\t\tx_offset\n\t\t\ty_offset\n\t\t\tradius\n\t\t\tcolor\n\t\t}\n\t}\n`;\n","export enum ImageFormat {\n\tAVIF = \"AVIF\",\n\tWEBP = \"WEBP\",\n\tGIF = \"GIF\",\n\tPNG = \"PNG\",\n}\n\nexport interface ImageFile {\n\tname: string;\n\tformat: ImageFormat;\n\twidth: number;\n\theight: number;\n\tanimated: boolean;\n\ttime: number;\n\tsize: number;\n}\n\nexport interface ImageHost {\n\turl: string;\n\tfiles: ImageFile[];\n}\n\nexport function getImage(host: ImageHost, format: ImageFormat, size: number): Partial & { url: string } {\n\tif (!host) return { url: \"\" };\n\n\tconst file = host.files.filter((fi) => fi.format === format)[size - 1];\n\tif (!file) {\n\t\treturn { url: \"\" };\n\t}\n\n\treturn {\n\t\t...file,\n\t\turl: `${host.url}/${file.name}`,\n\t};\n}\n\nexport enum ObjectKind {\n\tUSER = 1,\n\tEMOTE = 2,\n\tEMOTE_SET = 3,\n\tROLE = 4,\n\tENTITLEMENT = 5,\n\tBAN = 6,\n\tMESSAGE = 7,\n\tREPORT = 8,\n}\n\nexport type ListItemAction = \"ADD\" | \"UPDATE\" | \"REMOVE\";\n\nexport const RegExp = {\n\tEMOTE_NAME: /^[-_A-Za-z(!?&)$+:0-9]{2,100}$/,\n\tEMOTE_SET_NAME: /^[a-zA-Z0-9&'_-~# ]{1,40}$/,\n};\n\nexport interface APIError {\n\tstatus: string;\n\tstatus_code: number;\n\terror: string;\n\terror_code: number;\n\tdetails: Record;\n}\n\nexport function humanByteSize(size: number, decimals = 1): string {\n\tconst sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n\tif (size == 0) return \"0B\";\n\n\tconst i = parseInt(Math.floor(Math.log(size) / Math.log(1024)).toString());\n\treturn (size / Math.pow(1024, i)).toFixed(i < 2 ? 0 : decimals) + sizes[i];\n}\n","export interface Role {\n\tid: string;\n\tname: string;\n\tcolor: number;\n\tallowed: bigint | string;\n\tdenied: bigint | string;\n\tposition: number;\n\tinvisible: boolean;\n\tdefault?: boolean;\n}\n\nexport namespace Role {\n\texport type Permission = bigint;\n}\n\n// Emotes\n// Range: 1 << 1 - 1 << 5\nexport const Permissions = {\n\tCreateEmote: (1n << 0n) as Role.Permission, // 1 - Allows creating emotes\n\tEditEmote: (1n << 1n) as Role.Permission, // 2 - Allows editing / creating new versions of an emote\n\tCreateEmoteSet: (1n << 2n) as Role.Permission, // 4 - Allows creating emote sets\n\tEditEmoteSet: (1n << 3n) as Role.Permission, // 8 - Allows modifying emote sets\n\n\t// Unused Space\n\t// Range: 1 << 6 - 1 << 12\n\n\t// User / Misc / Special\n\t// Range: 1 << 13 - 1 << 1 << 29\n\tCreateReport: (1n << 13n) as Role.Permission, // 8192 - Allows creating reports\n\tSendMessages: (1n << 14n) as Role.Permission, // 16384 - Allows sending messages (i.e comments or user inboxs)\n\tUseZeroWidthEmoteType: (1n << 23n) as Role.Permission, // 8388608 - Allows using the Zero-Width emote type\n\tAnimateProfilePicture: (1n << 24n) as Role.Permission, // 16777216 - Allows the user's profile picture to be animated\n\tPriorityMessaging: (1n << 25n) as Role.Permission,\n\n\t// Moderation\n\t// Range: 1 << 30 - 1 << 53\n\tManageBans: (1n << 30n) as Role.Permission, // 1073741824 - (Mod) Allows creating or deleting bans\n\tManageRoles: (1n << 31n) as Role.Permission, // 2147483648 - (Mod) Allows creating, deleting and assigning roles to users\n\tManageReports: (1n << 32n) as Role.Permission, // 4294967296 - (Mod) Allows managing reports\n\tManageUsers: (1n << 33n) as Role.Permission, // 8589934592 - (Mod) Allows managing users\n\tEditAnyEmote: (1n << 41n) as Role.Permission, // 2199023255552 - (Mod) Allows editing any emote\n\tEditAnyEmoteSet: (1n << 42n) as Role.Permission, // 4398046511104 - (Mod) Allows editing any emote set, unless it is a privileged set\n\tBypassPrivacy: (1n << 48n) as Role.Permission, // 281474976710656 - (Mod) Lets the user see all non-public content\n\n\t// Administration\n\t// Range: 1 << 54 - 1 << 62\n\tSuperAdministrator: (1n << 62n) as Role.Permission, // 9223372036854775808 - (Admin) GRANTS EVERY PERMISSION /!\\\n\tManageNews: (1n << 54n) as Role.Permission, // 18014398509481984 - (Admin) Allows creating and editing news\n\tManageStack: (1n << 55n) as Role.Permission, // 36028797018963968 - (Admin) Allows managing the application stack\n\tManageCosmetics: (1n << 56n) as Role.Permission, // 72057594037927936 - (Admin) Allows managing cosmeics\n\tRunJobs: (1n << 57n) as Role.Permission, // 144115188075855872 - (Admin) Allows managing thing\n\tManageEntitlements: (1n << 58n) as Role.Permission, // 288230376151711744 - (Admin) Allows managing entitlements\n};\n","export const HasBits = (sum: number, bit: number): boolean => {\n\treturn (sum & bit) == bit;\n};\n\nexport const AddBits = (sum: number, add: number): number => {\n\treturn sum | add;\n};\n\nexport const RemoveBits = (sum: number, remove: number): number => {\n\treturn sum & ~remove;\n};\n\nexport const HasBits64 = (sum: bigint, bit: bigint): boolean => {\n\treturn (sum & bit) == bit;\n};\n\nexport const AddBits64 = (sum: bigint, add: bigint): bigint => {\n\treturn sum | add;\n};\n\nexport const RemoveBits64 = (sum: bigint, remove: bigint): bigint => {\n\treturn sum & ~remove;\n};\n","import { useStore } from \"@/store/main\";\nimport type { Emote } from \"@/structures/Emote\";\nimport type { EmoteSet } from \"@/structures/EmoteSet\";\nimport type { Role } from \"@/structures/Role\";\nimport { Permissions } from \"@/structures/Role\";\nimport { HasBits64 } from \"@/structures/util/BitField\";\nimport type { AuditLog } from \"./Audit\";\nimport type { Badge, Paint } from \"./Cosmetic\";\n\nexport interface User {\n\tid: string;\n\ttype: \"\" | \"BOT\" | \"SYSTEM\";\n\tusername: string;\n\tdisplay_name: string;\n\tcreated_at: string | Date;\n\tstyle: User.Style;\n\towned_emotes: Emote[];\n\teditors: User.Editor[];\n\teditor_of: User.Editor[];\n\troles: string[];\n\temote_sets: EmoteSet[];\n\tactivity: AuditLog[];\n\tavatar_url: string;\n\tbiography: string;\n\ttoken_version: number;\n\tconnections: User.Connection[];\n\tcosmetics: User.Cosmetic[];\n\tinbox_unread_count: number;\n}\n\nexport namespace User {\n\texport interface Style {\n\t\tcolor: number;\n\t\tbadge_id?: string;\n\t\tpaint_id?: string;\n\t\tbadge?: Badge;\n\t\tpaint?: Paint;\n\t}\n\n\texport interface Editor {\n\t\tid: string;\n\t\tconnections: string[];\n\t\tpermissions: number;\n\t\tvisible: boolean;\n\t\tuser?: User;\n\t}\n\n\texport const EditorPermission = {\n\t\tModifyEmotes: 1 << 0, // 1 - Allows modifying emotes in the user's active emote sets\n\t\tUsePrivateEmotes: 1 << 1, // 2 - Allows using the user's private emotes\n\t\tManageProfile: 1 << 2, // 4 - Allows managing the user's public profile\n\t\tManageOwnedEmotes: 1 << 3, // 8 - Allows managing the user's owned emotes\n\t\tManageEmoteSets: 1 << 4, // 16 - Allows managing the user's owned emote sets\n\t\tManageBilling: 1 << 5, // 32 - Allows managing billing and payments, such as subscriptions\n\t\tManageEditors: 1 << 6, // 64 - Allows adding or removing editors for the user\n\t\tViewMessages: 1 << 7, // 128 - Allows viewing the user's private messages, such as inbox\n\t};\n\n\texport interface Connection {\n\t\tid: string;\n\t\tusername: string;\n\t\tdisplay_name: string;\n\t\tplatform: Connection.Platform;\n\t\tlinked_at: string | Date;\n\t\temote_capacity: number;\n\t\temote_set_id: string;\n\t}\n\n\texport interface Cosmetic {\n\t\tid: string;\n\t\tkind: string;\n\t\tselected: boolean;\n\t}\n\n\texport namespace Connection {\n\t\texport interface Data {\n\t\t\tid: string;\n\t\t}\n\n\t\texport type Platform = \"TWITCH\" | \"YOUTUBE\" | \"DISCORD\" | \"KICK\";\n\n\t\texport interface Twitch extends Data {\n\t\t\tlogin: string;\n\t\t\tdisplay_name: string;\n\t\t\tbroadcaster_type: string;\n\t\t\tdescription: string;\n\t\t\tprofile_image_url: string;\n\t\t\toffline_image_url: string;\n\t\t\tview_count: number;\n\t\t\temail: string;\n\t\t\tcreated_at?: string | Date;\n\t\t}\n\n\t\texport interface YouTube extends Data {\n\t\t\ttitle: string;\n\t\t\tdescription: string;\n\t\t}\n\t}\n\n\texport const GetRoles = (user: User | null): Role[] => {\n\t\tif (!user) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst roles = useStore().roles;\n\t\tconst uRoles = [] as Role[];\n\t\tfor (const roleID of user.roles ?? []) {\n\t\t\tconst role = roles[roleID];\n\t\t\tif (!role) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tuRoles.push(role);\n\t\t}\n\t\treturn uRoles;\n\t};\n\n\texport type UserConnectionPlatform = \"TWITCH\" | \"YOUTUBE\" | \"DISCORD\";\n\n\t/**\n\t * Check if a user has a specific permission\n\t *\n\t * @param user the user to check\n\t * @param bit the permission bit to test\n\t * @returns whether or not the user has the permission\n\t */\n\texport const HasPermission = (user: User | null | undefined, bit: Role.Permission): boolean => {\n\t\tif (!user) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst roles = useStore().roles;\n\t\tlet total = 0n as Role.Permission;\n\t\tfor (const roleID of user.roles ?? []) {\n\t\t\tconst role = roles[roleID];\n\t\t\tif (!role) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst a = BigInt(role.allowed);\n\n\t\t\ttotal |= a;\n\t\t}\n\t\tfor (const roleID of user.roles ?? []) {\n\t\t\tconst role = roles[roleID];\n\t\t\tif (!role) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst d = BigInt(role.denied);\n\n\t\t\ttotal &= ~d;\n\t\t}\n\n\t\tif ((total & Permissions.SuperAdministrator) == Permissions.SuperAdministrator) {\n\t\t\treturn true;\n\t\t}\n\t\treturn HasBits64(total, bit);\n\t};\n\n\t/**\n\t * Compare two users for whether an actor has privileges against a victim.\n\t *\n\t * @param actor the actor user\n\t * @param victim the victim user\n\t * @returns whether the actor user has a higher privilege level than the victim\n\t */\n\texport const ComparePrivilege = (actor: User, victim: User): boolean => {\n\t\tconst roles = useStore().roles;\n\t\tconst aRoles = [] as Role[];\n\t\tfor (const roleID of actor.roles ?? []) {\n\t\t\tconst role = roles[roleID];\n\t\t\tif (!role) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\taRoles.push(role);\n\t\t}\n\t\tconst vRoles = [] as Role[];\n\t\tfor (const roleID of victim.roles ?? []) {\n\t\t\tconst role = roles[roleID];\n\t\t\tif (!role) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvRoles.push(role);\n\t\t}\n\n\t\tconst aPosition = Math.max(...aRoles.map((r) => r.position ?? 0), 0);\n\t\tconst vPosition = Math.max(...vRoles.map((r) => r.position ?? 0), 0);\n\n\t\treturn aPosition > vPosition;\n\t};\n\n\t/**\n\t * Check if a user is considered privileged, meaning they have\n\t * at least one elevated \"mod\" or \"admin\" permission\n\t *\n\t * @param user\n\t * @returns\n\t */\n\texport const IsPrivileged = (user: User): boolean =>\n\t\t[\n\t\t\t// Check for any admin/mod permission for admin access\n\t\t\tPermissions.ManageBans,\n\t\t\tPermissions.ManageReports,\n\t\t\tPermissions.ManageCosmetics,\n\t\t\tPermissions.ManageNews,\n\t\t\tPermissions.ManageRoles,\n\t\t\tPermissions.EditAnyEmote,\n\t\t\tPermissions.EditAnyEmoteSet,\n\t\t]\n\t\t\t.map((bit) => HasPermission(user, bit))\n\t\t\t.filter((b) => b === true).length > 0;\n\n\texport function getStyledPlatformName(p: Connection.Platform): string {\n\t\tswitch (p) {\n\t\t\tcase \"TWITCH\":\n\t\t\t\treturn \"Twitch\";\n\t\t\tcase \"YOUTUBE\":\n\t\t\t\treturn \"YouTube\";\n\t\t\tcase \"DISCORD\":\n\t\t\t\treturn \"Discord\";\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t}\n\t}\n}\n","import { shallowRef, watchEffect, readonly, unref, ref, isVue3, version, watch, customRef, getCurrentScope, onScopeDispose, effectScope, provide, inject, isRef, computed, reactive, toRefs as toRefs$1, toRef, isVue2, set as set$1, getCurrentInstance, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue-demi';\n\nvar __defProp$9 = Object.defineProperty;\nvar __defProps$6 = Object.defineProperties;\nvar __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$b = Object.getOwnPropertySymbols;\nvar __hasOwnProp$b = Object.prototype.hasOwnProperty;\nvar __propIsEnum$b = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$9 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$b.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n if (__getOwnPropSymbols$b)\n for (var prop of __getOwnPropSymbols$b(b)) {\n if (__propIsEnum$b.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, __spreadProps$6(__spreadValues$9({}, options), {\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n }));\n return readonly(result);\n}\n\nvar _a;\nconst isClient = typeof window !== \"undefined\";\nconst isDef = (val) => typeof val !== \"undefined\";\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isBoolean = (val) => typeof val === \"boolean\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isNumber = (val) => typeof val === \"number\";\nconst isString = (val) => typeof val === \"string\";\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst isWindow = (val) => typeof window !== \"undefined\" && toString.call(val) === \"[object Window]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst isIOS = isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && /iP(ad|hone|od)/.test(window.navigator.userAgent);\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\n\nfunction resolveUnref(r) {\n return typeof r === \"function\" ? r() : unref(r);\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n const filter = (invoke) => {\n const duration = resolveUnref(ms);\n const maxDuration = resolveUnref(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = null;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = null;\n resolve(invoke());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = null;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(ms, trailing = true, leading = true, rejectOnCancel = false) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = resolveUnref(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n return new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, duration - elapsed);\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n const isActive = ref(true);\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive, pause, resume, eventFilter };\n}\n\nfunction __onlyVue3(name = \"this function\") {\n if (isVue3)\n return;\n throw new Error(`[VueUse] ${name} is only works on Vue 3.`);\n}\nfunction __onlyVue27Plus(name = \"this function\") {\n if (isVue3 || version.startsWith(\"2.7.\"))\n return;\n throw new Error(`[VueUse] ${name} is only works on Vue 2.7 or above.`);\n}\nconst directiveHooks = {\n mounted: isVue3 ? \"mounted\" : \"inserted\",\n updated: isVue3 ? \"updated\" : \"componentUpdated\",\n unmounted: isVue3 ? \"unmounted\" : \"unbind\"\n};\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?[0-9]+\\.?[0-9]*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\n\nfunction computedWithControl(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = ref(true);\n const update = () => {\n dirty.value = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\" });\n const get = isFunction(fn) ? fn : fn.get;\n const set = isFunction(fn) ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = get();\n dirty.value = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n if (Object.isExtensible(result))\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = [];\n const off = (fn) => {\n const index = fns.indexOf(fn);\n if (index !== -1)\n fns.splice(index, 1);\n };\n const on = (fn) => {\n fns.push(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (param) => {\n fns.forEach((fn) => fn(param));\n };\n return {\n on,\n off,\n trigger\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return () => {\n if (!initialized) {\n state = scope.run(stateFactory);\n initialized = true;\n }\n return state;\n };\n}\n\nfunction createInjectionState(composable) {\n const key = Symbol(\"InjectionState\");\n const useProvidingState = (...args) => {\n provide(key, composable(...args));\n };\n const useInjectedState = () => inject(key);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!state) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n __onlyVue27Plus();\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$a.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(b)) {\n if (__propIsEnum$a.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = __spreadValues$8({}, obj);\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : resolveUnref;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n }));\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n return reactiveComputed(() => Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n return reactive(Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = defaultValue;\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = defaultValue;\n trigger();\n }, resolveUnref(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(debounceFilter(ms, options), fn);\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(throttleFilter(ms, trailing, leading, rejectOnCancel), fn);\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(ref, {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n }, { enumerable: true });\n}\nconst controlledRef = refWithControl;\n\nfunction resolveRef(r) {\n return typeof r === \"function\" ? computed(r) : ref(r);\n}\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n if (isVue2) {\n set$1(...args);\n } else {\n const [target, key, value] = args;\n target[key] = value;\n }\n }\n}\n\nfunction syncRef(left, right, options = {}) {\n var _a, _b;\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options;\n let watchLeft;\n let watchRight;\n const transformLTR = (_a = transform.ltr) != null ? _a : (v) => v;\n const transformRTL = (_b = transform.rtl) != null ? _b : (v) => v;\n if (direction === \"both\" || direction === \"ltr\") {\n watchLeft = watch(left, (newValue) => right.value = transformLTR(newValue), { flush, deep, immediate });\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchRight = watch(right, (newValue) => left.value = transformRTL(newValue), { flush, deep, immediate });\n }\n return () => {\n watchLeft == null ? void 0 : watchLeft();\n watchRight == null ? void 0 : watchRight();\n };\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n if (!Array.isArray(targets))\n targets = [targets];\n return watch(source, (newValue) => targets.forEach((target) => target.value = newValue), { flush, deep, immediate });\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nfunction toRefs(objectRef) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? new Array(objectRef.value.length) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = __spreadProps$5(__spreadValues$7({}, objectRef.value), { [key]: v });\n Object.setPrototypeOf(newObject, objectRef.value);\n objectRef.value = newObject;\n }\n }\n }));\n }\n return result;\n}\n\nfunction tryOnBeforeMount(fn, sync = true) {\n if (getCurrentInstance())\n onBeforeMount(fn);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn) {\n if (getCurrentInstance())\n onBeforeUnmount(fn);\n}\n\nfunction tryOnMounted(fn, sync = true) {\n if (getCurrentInstance())\n onMounted(fn);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn) {\n if (getCurrentInstance())\n onUnmounted(fn);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(r, (v) => {\n if (condition(v) !== isNot) {\n stop == null ? void 0 : stop();\n resolve(v);\n }\n }, {\n flush,\n deep,\n immediate: true\n });\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(promiseTimeout(timeout, throwOnTimeout).then(() => resolveUnref(r)).finally(() => stop == null ? void 0 : stop()));\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch([r, value], ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n stop == null ? void 0 : stop();\n resolve(v1);\n }\n }, {\n flush,\n deep,\n immediate: true\n });\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(promiseTimeout(timeout, throwOnTimeout).then(() => resolveUnref(r)).finally(() => {\n stop == null ? void 0 : stop();\n return resolveUnref(r);\n }));\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(resolveUnref(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(resolveUnref(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction useArrayEvery(list, fn) {\n return computed(() => resolveUnref(list).every((element, index, array) => fn(resolveUnref(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n return computed(() => resolveUnref(list).map((i) => resolveUnref(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n return computed(() => resolveUnref(resolveUnref(list).find((element, index, array) => fn(resolveUnref(element), index, array))));\n}\n\nfunction useArrayFindIndex(list, fn) {\n return computed(() => resolveUnref(list).findIndex((element, index, array) => fn(resolveUnref(element), index, array)));\n}\n\nfunction useArrayJoin(list, separator) {\n return computed(() => resolveUnref(list).map((i) => resolveUnref(i)).join(resolveUnref(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n return computed(() => resolveUnref(list).map((i) => resolveUnref(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(resolveUnref(sum), resolveUnref(value), index);\n return computed(() => {\n const resolved = resolveUnref(list);\n return args.length ? resolved.reduce(reduceCallback, resolveUnref(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\nfunction useArraySome(list, fn) {\n return computed(() => resolveUnref(list).some((element, index, array) => fn(resolveUnref(element), index, array)));\n}\n\nfunction useArrayUnique(list) {\n return computed(() => [...new Set(resolveUnref(list).map((element) => resolveUnref(element)))]);\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n const count = ref(initialValue);\n const {\n max = Infinity,\n min = -Infinity\n } = options;\n const inc = (delta = 1) => count.value = Math.min(max, count.value + delta);\n const dec = (delta = 1) => count.value = Math.max(min, count.value - delta);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = initialValue) => {\n initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nconst REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\nconst defaultMeridiem = (hours, minutes, isLowercase, hasPeriod) => {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n};\nconst formatDate = (date, formatStr, options = {}) => {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const matches = {\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(options.locales, { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(options.locales, { month: \"long\" }),\n D: () => String(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(options.locales, { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(options.locales, { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(options.locales, { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true)\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => $1 || matches[match]());\n};\nconst normalizeDate = (date) => {\n if (date === null)\n return new Date(NaN);\n if (date === void 0)\n return new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n};\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(resolveUnref(date)), resolveUnref(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = ref(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n if (unref(interval) <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n timer = setInterval(cb, resolveUnref(interval));\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || isFunction(interval)) {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = ref(0);\n const update = () => counter.value += 1;\n const controls = useIntervalFn(callback ? () => {\n update();\n callback(counter.value);\n } : update, interval, { immediate });\n if (exposeControls) {\n return __spreadValues$6({\n counter\n }, controls);\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = ref((_a = options.initialValue) != null ? _a : null);\n watch(source, () => ms.value = timestamp(), options);\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true\n } = options;\n const isPending = ref(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, resolveUnref(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending,\n start,\n stop\n };\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$7.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(b)) {\n if (__propIsEnum$7.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(callback != null ? callback : noop, interval, options);\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return __spreadValues$5({\n ready\n }, controls);\n } else {\n return ready;\n }\n}\n\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = resolveUnref(value);\n if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\nfunction useToString(value) {\n return computed(() => `${resolveUnref(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = ref(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = resolveUnref(truthyValue);\n _value.value = _value.value === truthy ? resolveUnref(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [\n ...source instanceof Function ? source() : Array.isArray(source) ? source : unref(source)\n ];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = new Array(oldList.length);\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __objRest$5 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$6.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$6.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchWithFilter(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$5(_a, [\n \"eventFilter\"\n ]);\n return watch(source, createFilterWrapper(eventFilter, cb), watchOptions);\n}\n\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __objRest$4 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$5.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$5.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchAtMost(source, cb, options) {\n const _a = options, {\n count\n } = _a, watchOptions = __objRest$4(_a, [\n \"count\"\n ]);\n const current = ref(0);\n const stop = watchWithFilter(source, (...args) => {\n current.value += 1;\n if (current.value >= resolveUnref(count))\n nextTick(() => stop());\n cb(...args);\n }, watchOptions);\n return { count: current, stop };\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nvar __objRest$3 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$4.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$4.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchDebounced(source, cb, options = {}) {\n const _a = options, {\n debounce = 0,\n maxWait = void 0\n } = _a, watchOptions = __objRest$3(_a, [\n \"debounce\",\n \"maxWait\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$4(__spreadValues$4({}, watchOptions), {\n eventFilter: debounceFilter(debounce, { maxWait })\n }));\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$3.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$3.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchIgnorable(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$2(_a, [\n \"eventFilter\"\n ]);\n const filteredCb = createFilterWrapper(eventFilter, cb);\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = ref(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(source, (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n }, watchOptions);\n } else {\n const disposables = [];\n const ignoreCounter = ref(0);\n const syncCounter = ref(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(watch(source, () => {\n syncCounter.value++;\n }, __spreadProps$3(__spreadValues$3({}, watchOptions), { flush: \"sync\" })));\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(watch(source, (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n }, watchOptions));\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchPausable(source, cb, options = {}) {\n const _a = options, {\n eventFilter: filter\n } = _a, watchOptions = __objRest$1(_a, [\n \"eventFilter\"\n ]);\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n const stop = watchWithFilter(source, cb, __spreadProps$2(__spreadValues$2({}, watchOptions), {\n eventFilter\n }));\n return { stop, pause, resume, isActive };\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchThrottled(source, cb, options = {}) {\n const _a = options, {\n throttle = 0,\n trailing = true,\n leading = true\n } = _a, watchOptions = __objRest(_a, [\n \"throttle\",\n \"trailing\",\n \"leading\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$1(__spreadValues$1({}, watchOptions), {\n eventFilter: throttleFilter(throttle, trailing, leading)\n }));\n}\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return __spreadProps(__spreadValues({}, res), {\n trigger\n });\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => getOneWatchSource(item));\n return getOneWatchSource(sources);\n}\nfunction getOneWatchSource(source) {\n return typeof source === \"function\" ? source() : unref(source);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n return watch(source, (v, ov, onInvalidate) => {\n if (v)\n cb(v, ov, onInvalidate);\n }, options);\n}\n\nexport { __onlyVue27Plus, __onlyVue3, assert, refAutoReset as autoResetRef, bypassFilter, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, directiveHooks, computedEager as eagerComputed, extendRef, formatDate, get, hasOwn, identity, watchIgnorable as ignorableWatch, increaseWithUnit, invoke, isBoolean, isClient, isDef, isDefined, isFunction, isIOS, isNumber, isObject, isString, isWindow, makeDestructurable, noop, normalizeDate, now, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toReactive, toRefs, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchIgnorable, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, resolveUnref, isClient, isString, tryOnScopeDispose, tryOnMounted, computedWithControl, promiseTimeout, isFunction, resolveRef, increaseWithUnit, useTimeoutFn, pausableWatch, createEventHook, timestamp, pausableFilter, watchIgnorable, debounceFilter, createFilterWrapper, bypassFilter, createSingletonPromise, toRefs, containsProp, until, hasOwn, isDef, throttleFilter, useDebounceFn, useThrottleFn, isObject, isNumber, useIntervalFn, clamp, syncRef, objectPick, tryOnUnmounted, isIOS, watchWithFilter, identity } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, watchEffect, computed, inject, unref, watch, getCurrentInstance, customRef, onUpdated, reactive, shallowRef, nextTick, onMounted, markRaw, getCurrentScope, readonly, isVue2, set, del, onBeforeUpdate } from 'vue-demi';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n onError = noop\n } = options;\n const started = ref(!lazy);\n const current = ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nconst createUnrefFn = (fn) => {\n return function(...args) {\n return fn.apply(this, args.map((i) => unref(i)));\n };\n};\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = resolveUnref(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n let target;\n let events;\n let listeners;\n let options;\n if (isString(args[0]) || Array.isArray(args[0])) {\n [events, listeners, options] = args;\n target = defaultWindow;\n } else {\n [target, events, listeners, options] = args;\n }\n if (!target)\n return noop;\n if (!Array.isArray(events))\n events = [events];\n if (!Array.isArray(listeners))\n listeners = [listeners];\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener) => {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (!el)\n return;\n cleanups.push(...events.flatMap((event) => {\n return listeners.map((listener) => register(el, event, listener));\n }));\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\n\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;\n if (!window)\n return;\n let shouldListen = true;\n let fallback;\n const shouldIgnore = (event) => {\n return ignore.some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n const listener = (event) => {\n window.clearTimeout(fallback);\n const el = unrefElement(target);\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n const cleanup = [\n useEventListener(window, \"click\", listener, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n if (el)\n shouldListen = !e.composedPath().includes(el) && !shouldIgnore(e);\n }, { passive: true }),\n useEventListener(window, \"pointerup\", (e) => {\n if (e.button === 0) {\n const path = e.composedPath();\n e.composedPath = () => path;\n fallback = window.setTimeout(() => listener(e), 50);\n }\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement)))\n handler(event);\n })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nvar __defProp$m = Object.defineProperty;\nvar __defProps$9 = Object.defineProperties;\nvar __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$o = Object.getOwnPropertySymbols;\nvar __hasOwnProp$o = Object.prototype.hasOwnProperty;\nvar __propIsEnum$o = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$m = (obj, key, value) => key in obj ? __defProp$m(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$m = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$o.call(b, prop))\n __defNormalProp$m(a, prop, b[prop]);\n if (__getOwnPropSymbols$o)\n for (var prop of __getOwnPropSymbols$o(b)) {\n if (__propIsEnum$o.call(b, prop))\n __defNormalProp$m(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));\nconst createKeyPredicate = (keyFilter) => {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n};\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const { target = defaultWindow, eventName = \"keydown\", passive = false } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$m({}, options), { eventName: \"keydown\" }));\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$m({}, options), { eventName: \"keypress\" }));\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$m({}, options), { eventName: \"keyup\" }));\n}\n\nconst DEFAULT_DELAY = 500;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n }\n function onDown(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n timeout = setTimeout(() => handler(ev), (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY);\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions);\n useEventListener(elementRef, \"pointerup\", clear, listenerOptions);\n useEventListener(elementRef, \"pointerleave\", clear, listenerOptions);\n}\n\nconst isFocusedElementEditable = () => {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n};\nconst isTypedCharValid = ({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) => {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n};\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useActiveElement(options = {}) {\n var _a;\n const { window = defaultWindow } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const activeElement = computedWithControl(() => null, () => document == null ? void 0 : document.activeElement);\n if (window) {\n useEventListener(window, \"blur\", (event) => {\n if (event.relatedTarget !== null)\n return;\n activeElement.trigger();\n }, true);\n useEventListener(window, \"focus\", activeElement.trigger, true);\n }\n return activeElement;\n}\n\nfunction useAsyncQueue(tasks, options = {}) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop\n } = options;\n const promiseState = {\n pending: \"pending\",\n rejected: \"rejected\",\n fulfilled: \"fulfilled\"\n };\n const initialResult = Array.from(new Array(tasks.length), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = ref(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n return curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n activeIndex.value === tasks.length - 1 && onFinished();\n return currentRes;\n });\n }).catch((e) => {\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = ref(false);\n const isLoading = ref(false);\n const error = ref(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw error;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate)\n execute(delay);\n return {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = ref(\"\");\n const promise = ref();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = resolveUnref(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => base64.value = res);\n return promise.value;\n }\n if (isRef(target) || isFunction(target))\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useSupported(callback, sync = false) {\n const isSupported = ref();\n const update = () => isSupported.value = Boolean(callback());\n update();\n tryOnMounted(update, sync);\n return isSupported;\n}\n\nfunction useBattery({ navigator = defaultNavigator } = {}) {\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator);\n const charging = ref(false);\n const chargingTime = ref(0);\n const dischargingTime = ref(0);\n const level = ref(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n for (const event of events)\n useEventListener(battery, event, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef(void 0);\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = ref();\n const isConnected = computed(() => {\n var _a;\n return ((_a = server.value) == null ? void 0 : _a.connected) || false;\n });\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n device.value.addEventListener(\"gattserverdisconnected\", () => {\n });\n try {\n server.value = await device.value.gatt.connect();\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected,\n device,\n requestDevice,\n server,\n error\n };\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n let mediaQuery;\n const matches = ref(false);\n const cleanup = () => {\n if (!mediaQuery)\n return;\n if (\"removeEventListener\" in mediaQuery)\n mediaQuery.removeEventListener(\"change\", update);\n else\n mediaQuery.removeListener(update);\n };\n const update = () => {\n if (!isSupported.value)\n return;\n cleanup();\n mediaQuery = window.matchMedia(resolveRef(query).value);\n matches.value = mediaQuery.matches;\n if (\"addEventListener\" in mediaQuery)\n mediaQuery.addEventListener(\"change\", update);\n else\n mediaQuery.addListener(update);\n };\n watchEffect(update);\n tryOnScopeDispose(() => cleanup());\n return matches;\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetify = {\n xs: 600,\n sm: 960,\n md: 1264,\n lg: 1904\n};\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 600,\n sm: 1024,\n md: 1440,\n lg: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\n\nvar __defProp$l = Object.defineProperty;\nvar __getOwnPropSymbols$n = Object.getOwnPropertySymbols;\nvar __hasOwnProp$n = Object.prototype.hasOwnProperty;\nvar __propIsEnum$n = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$l = (obj, key, value) => key in obj ? __defProp$l(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$l = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$n.call(b, prop))\n __defNormalProp$l(a, prop, b[prop]);\n if (__getOwnPropSymbols$n)\n for (var prop of __getOwnPropSymbols$n(b)) {\n if (__propIsEnum$n.call(b, prop))\n __defNormalProp$l(a, prop, b[prop]);\n }\n return a;\n};\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = breakpoints[k];\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow } = options;\n function match(query) {\n if (!window)\n return false;\n return window.matchMedia(query).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(`(min-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => greaterOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n return __spreadValues$l({\n greater(k) {\n return useMediaQuery(`(min-width: ${getValue(k, 0.1)})`, options);\n },\n greaterOrEqual,\n smaller(k) {\n return useMediaQuery(`(max-width: ${getValue(k, -0.1)})`, options);\n },\n smallerOrEqual(k) {\n return useMediaQuery(`(max-width: ${getValue(k)})`, options);\n },\n between(a, b) {\n return useMediaQuery(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(`(min-width: ${getValue(k, 0.1)})`);\n },\n isGreaterOrEqual(k) {\n return match(`(min-width: ${getValue(k)})`);\n },\n isSmaller(k) {\n return match(`(max-width: ${getValue(k, -0.1)})`);\n },\n isSmallerOrEqual(k) {\n return match(`(max-width: ${getValue(k)})`);\n },\n isInBetween(a, b) {\n return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n }\n }, shortcutMethods);\n}\n\nconst useBroadcastChannel = (options) => {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = ref(false);\n const channel = ref();\n const data = ref();\n const error = ref(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n channel.value.addEventListener(\"message\", (e) => {\n data.value = e.data;\n }, { passive: true });\n channel.value.addEventListener(\"messageerror\", (e) => {\n error.value = e;\n }, { passive: true });\n channel.value.addEventListener(\"close\", () => {\n isClosed.value = true;\n });\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n};\n\nfunction useBrowserLocation({ window = defaultWindow } = {}) {\n const buildState = (trigger) => {\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { hash, host, hostname, href, origin, pathname, port, protocol, search } = (window == null ? void 0 : window.location) || {};\n return {\n trigger,\n state: state2,\n length,\n hash,\n host,\n hostname,\n href,\n origin,\n pathname,\n port,\n protocol,\n search\n };\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n const cachedValue = ref(refValue.value);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const events = [\"copy\", \"cut\"];\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = ref(\"\");\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateText() {\n if (isClipboardApiSupported.value) {\n navigator.clipboard.readText().then((value) => {\n text.value = value;\n });\n } else {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read) {\n for (const event of events)\n useEventListener(event, updateText);\n }\n async function copy(value = resolveUnref(source)) {\n if (isSupported.value && value != null) {\n if (isClipboardApiSupported.value)\n await navigator.clipboard.writeText(value);\n else\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nvar __defProp$k = Object.defineProperty;\nvar __defProps$8 = Object.defineProperties;\nvar __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$m = Object.getOwnPropertySymbols;\nvar __hasOwnProp$m = Object.prototype.hasOwnProperty;\nvar __propIsEnum$m = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$k = (obj, key, value) => key in obj ? __defProp$k(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$k = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$m.call(b, prop))\n __defNormalProp$k(a, prop, b[prop]);\n if (__getOwnPropSymbols$m)\n for (var prop of __getOwnPropSymbols$m(b)) {\n if (__propIsEnum$m.call(b, prop))\n __defNormalProp$k(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const {\n manual,\n clone = cloneFnJSON,\n deep = true,\n immediate = true\n } = options;\n function sync() {\n cloned.value = clone(unref(source));\n }\n if (!manual && isRef(source)) {\n watch(source, sync, __spreadProps$8(__spreadValues$k({}, options), {\n deep,\n immediate\n }));\n } else {\n sync();\n }\n return { cloned, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\n_global[globalKey] = _global[globalKey] || {};\nconst handlers = _global[globalKey];\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nvar __defProp$j = Object.defineProperty;\nvar __getOwnPropSymbols$l = Object.getOwnPropertySymbols;\nvar __hasOwnProp$l = Object.prototype.hasOwnProperty;\nvar __propIsEnum$l = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$j = (obj, key, value) => key in obj ? __defProp$j(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$j = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$l.call(b, prop))\n __defNormalProp$j(a, prop, b[prop]);\n if (__getOwnPropSymbols$l)\n for (var prop of __getOwnPropSymbols$l(b)) {\n if (__propIsEnum$l.call(b, prop))\n __defNormalProp$j(a, prop, b[prop]);\n }\n return a;\n};\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const data = (shallow ? shallowRef : ref)(defaults);\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = resolveUnref(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(data, () => write(data.value), { flush, deep, eventFilter });\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", update);\n update();\n return data;\n function write(v) {\n try {\n if (v == null) {\n storage.removeItem(key);\n } else {\n const serialized = serializer.write(v);\n const oldValue = storage.getItem(key);\n if (oldValue !== serialized) {\n storage.setItem(key, serialized);\n if (window) {\n window == null ? void 0 : window.dispatchEvent(new StorageEvent(\"storage\", {\n key,\n oldValue,\n newValue: serialized,\n storageArea: storage\n }));\n }\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(key);\n if (rawValue == null) {\n if (writeDefaults && rawInit !== null)\n storage.setItem(key, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (isFunction(mergeDefaults))\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return __spreadValues$j(__spreadValues$j({}, rawInit), value);\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== key)\n return;\n pauseWatch();\n try {\n data.value = read(event);\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nvar __defProp$i = Object.defineProperty;\nvar __getOwnPropSymbols$k = Object.getOwnPropertySymbols;\nvar __hasOwnProp$k = Object.prototype.hasOwnProperty;\nvar __propIsEnum$k = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$i = (obj, key, value) => key in obj ? __defProp$i(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$i = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$k.call(b, prop))\n __defNormalProp$i(a, prop, b[prop]);\n if (__getOwnPropSymbols$k)\n for (var prop of __getOwnPropSymbols$k(b)) {\n if (__propIsEnum$k.call(b, prop))\n __defNormalProp$i(a, prop, b[prop]);\n }\n return a;\n};\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto\n } = options;\n const modes = __spreadValues$i({\n auto: \"\",\n light: \"light\",\n dark: \"dark\"\n }, options.modes || {});\n const preferredDark = usePreferredDark({ window });\n const preferredMode = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? ref(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed({\n get() {\n return store.value === \"auto\" && !emitAuto ? preferredMode.value : store.value;\n },\n set(v) {\n store.value = v;\n }\n });\n const updateHTMLAttrs = getSSRHandler(\"updateHTMLAttrs\", (selector2, attribute2, value) => {\n const el = window == null ? void 0 : window.document.querySelector(selector2);\n if (!el)\n return;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n el.classList.add(v);\n else\n el.classList.remove(v);\n });\n } else {\n el.setAttribute(attribute2, value);\n }\n });\n function defaultOnChanged(mode) {\n var _a;\n const resolvedMode = mode === \"auto\" ? preferredMode.value : mode;\n updateHTMLAttrs(selector, attribute, (_a = modes[resolvedMode]) != null ? _a : resolvedMode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n if (emitAuto)\n watch(preferredMode, () => onChanged(state.value), { flush: \"post\" });\n tryOnMounted(() => onChanged(state.value));\n return state;\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCssVar(prop, target, { window = defaultWindow, initialValue = \"\" } = {}) {\n const variable = ref(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n watch([elRef, () => resolveUnref(prop)], ([el, prop2]) => {\n var _a;\n if (el && window) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(prop2)) == null ? void 0 : _a.trim();\n variable.value = value || initialValue;\n }\n }, { immediate: true });\n watch(variable, (val) => {\n var _a;\n if ((_a = elRef.value) == null ? void 0 : _a.style)\n elRef.value.style.setProperty(resolveUnref(prop), val);\n });\n return variable;\n}\n\nfunction useCurrentElement() {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(() => null, () => vm.proxy.$el);\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n var _a;\n const state = shallowRef((_a = options == null ? void 0 : options.initialValue) != null ? _a : list[0]);\n const index = computed({\n get() {\n var _a2;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, list) : list.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a2 = options == null ? void 0 : options.fallbackIndex) != null ? _a2 : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const length = list.length;\n const index2 = (i % length + length) % length;\n const value = list[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n return {\n state,\n index,\n next,\n prev\n };\n}\n\nvar __defProp$h = Object.defineProperty;\nvar __defProps$7 = Object.defineProperties;\nvar __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$j = Object.getOwnPropertySymbols;\nvar __hasOwnProp$j = Object.prototype.hasOwnProperty;\nvar __propIsEnum$j = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$h = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n if (__getOwnPropSymbols$j)\n for (var prop of __getOwnPropSymbols$j(b)) {\n if (__propIsEnum$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\",\n window = defaultWindow\n } = options;\n const mode = useColorMode(__spreadProps$7(__spreadValues$h({}, options), {\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\");\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n }));\n const preferredDark = usePreferredDark({ window });\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n if (v === preferredDark.value)\n mode.value = \"auto\";\n else\n mode.value = v ? \"dark\" : \"light\";\n }\n });\n return isDark;\n}\n\nconst fnBypass = (v) => v;\nconst fnSetSource = (source, value) => source.value = value;\nfunction defaultDump(clone) {\n return clone ? isFunction(clone) ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? isFunction(clone) ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Infinity);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nvar __defProp$g = Object.defineProperty;\nvar __defProps$6 = Object.defineProperties;\nvar __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$i = Object.getOwnPropertySymbols;\nvar __hasOwnProp$i = Object.prototype.hasOwnProperty;\nvar __propIsEnum$i = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$g = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n if (__getOwnPropSymbols$i)\n for (var prop of __getOwnPropSymbols$i(b)) {\n if (__propIsEnum$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(source, commit, { deep, flush, eventFilter: composedFilter });\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, __spreadProps$6(__spreadValues$g({}, options), { clone: options.clone || deep, setSource }));\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return __spreadProps$6(__spreadValues$g({}, manualHistory), {\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n });\n}\n\nvar __defProp$f = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$h = Object.getOwnPropertySymbols;\nvar __hasOwnProp$h = Object.prototype.hasOwnProperty;\nvar __propIsEnum$h = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$f = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n if (__getOwnPropSymbols$h)\n for (var prop of __getOwnPropSymbols$h(b)) {\n if (__propIsEnum$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, __spreadProps$5(__spreadValues$f({}, options), { eventFilter: filter }));\n return __spreadValues$f({}, history);\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n eventFilter = bypassFilter\n } = options;\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = ref(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n if (window) {\n const onDeviceMotion = createFilterWrapper(eventFilter, (event) => {\n acceleration.value = event.acceleration;\n accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n rotationRate.value = event.rotationRate;\n interval.value = event.interval;\n });\n useEventListener(window, \"devicemotion\", onDeviceMotion);\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = ref(false);\n const alpha = ref(null);\n const beta = ref(null);\n const gamma = ref(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nfunction useDevicePixelRatio({\n window = defaultWindow\n} = {}) {\n if (!window) {\n return {\n pixelRatio: ref(1)\n };\n }\n const pixelRatio = ref(1);\n const cleanups = [];\n const cleanup = () => {\n cleanups.map((i) => i());\n cleanups.length = 0;\n };\n const observe = () => {\n pixelRatio.value = window.devicePixelRatio;\n cleanup();\n const media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);\n media.addEventListener(\"change\", observe, { once: true });\n cleanups.push(() => {\n media.removeEventListener(\"change\", observe);\n });\n };\n observe();\n tryOnScopeDispose(cleanup);\n return { pixelRatio };\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n let permissionStatus;\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = ref();\n const onChange = () => {\n if (permissionStatus)\n state.value = permissionStatus.state;\n };\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus) {\n try {\n permissionStatus = await navigator.permissions.query(desc);\n useEventListener(permissionStatus, \"change\", onChange);\n onChange();\n } catch (e) {\n state.value = \"prompt\";\n }\n }\n return permissionStatus;\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = ref(false);\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n }\n async function ensurePermissions() {\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(\"camera\", { controls: true });\n await query();\n if (state.value !== \"granted\") {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((t) => t.stop());\n update();\n permissionGranted.value = true;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update);\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility({ document = defaultDocument } = {}) {\n if (!document)\n return ref(\"visible\");\n const visibility = ref(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n });\n return visibility;\n}\n\nvar __defProp$e = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$g = Object.getOwnPropertySymbols;\nvar __hasOwnProp$g = Object.prototype.hasOwnProperty;\nvar __propIsEnum$g = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$e = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n if (__getOwnPropSymbols$g)\n for (var prop of __getOwnPropSymbols$g(b)) {\n if (__propIsEnum$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nfunction useDraggable(target, options = {}) {\n var _a, _b, _c;\n const draggingElement = (_a = options.draggingElement) != null ? _a : defaultWindow;\n const draggingHandle = (_b = options.handle) != null ? _b : target;\n const position = ref((_c = resolveUnref(options.initialValue)) != null ? _c : { x: 0, y: 0 });\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (options.pointerTypes)\n return options.pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (resolveUnref(options.preventDefault))\n e.preventDefault();\n if (resolveUnref(options.stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (resolveUnref(options.exact) && e.target !== resolveUnref(target))\n return;\n const rect = resolveUnref(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n };\n if (((_a2 = options.onStart) == null ? void 0 : _a2.call(options, pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n position.value = {\n x: e.clientX - pressedDelta.value.x,\n y: e.clientY - pressedDelta.value.y\n };\n (_a2 = options.onMove) == null ? void 0 : _a2.call(options, position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n (_a2 = options.onEnd) == null ? void 0 : _a2.call(options, position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n useEventListener(draggingHandle, \"pointerdown\", start, true);\n useEventListener(draggingElement, \"pointermove\", move, true);\n useEventListener(draggingElement, \"pointerup\", end, true);\n }\n return __spreadProps$4(__spreadValues$e({}, toRefs(position)), {\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(() => `left:${position.value.x}px;top:${position.value.y}px;`)\n });\n}\n\nfunction useDropZone(target, onDrop) {\n const isOverDropZone = ref(false);\n let counter = 0;\n if (isClient) {\n useEventListener(target, \"dragenter\", (event) => {\n event.preventDefault();\n counter += 1;\n isOverDropZone.value = true;\n });\n useEventListener(target, \"dragover\", (event) => {\n event.preventDefault();\n });\n useEventListener(target, \"dragleave\", (event) => {\n event.preventDefault();\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n });\n useEventListener(target, \"drop\", (event) => {\n var _a, _b;\n event.preventDefault();\n counter = 0;\n isOverDropZone.value = false;\n const files = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);\n onDrop == null ? void 0 : onDrop(files.length === 0 ? null : files);\n });\n }\n return {\n isOverDropZone\n };\n}\n\nvar __getOwnPropSymbols$f = Object.getOwnPropertySymbols;\nvar __hasOwnProp$f = Object.prototype.hasOwnProperty;\nvar __propIsEnum$f = Object.prototype.propertyIsEnumerable;\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$f.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$f)\n for (var prop of __getOwnPropSymbols$f(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$f.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useResizeObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, observerOptions = __objRest$2(_a, [\"window\"]);\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported.value && window && el) {\n observer = new ResizeObserver(callback);\n observer.observe(el, observerOptions);\n }\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true\n } = options;\n const height = ref(0);\n const bottom = ref(0);\n const left = ref(0);\n const right = ref(0);\n const top = ref(0);\n const width = ref(0);\n const x = ref(0);\n const y = ref(0);\n function update() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n window = defaultWindow\n } = options;\n const isActive = ref(false);\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n const delta = timestamp - previousFrameTimestamp;\n fn({ delta, timestamp });\n previousFrameTimestamp = timestamp;\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$d = Object.defineProperty;\nvar __getOwnPropSymbols$e = Object.getOwnPropertySymbols;\nvar __hasOwnProp$e = Object.prototype.hasOwnProperty;\nvar __propIsEnum$e = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$d = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$e.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n if (__getOwnPropSymbols$e)\n for (var prop of __getOwnPropSymbols$e(b)) {\n if (__propIsEnum$e.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n }\n return a;\n};\nfunction useElementByPoint(options) {\n const element = ref(null);\n const { x, y } = options;\n const controls = useRafFn(() => {\n element.value = document.elementFromPoint(resolveUnref(x), resolveUnref(y));\n });\n return __spreadValues$d({\n element\n }, controls);\n}\n\nfunction useElementHover(el) {\n const isHovered = ref(false);\n useEventListener(el, \"mouseenter\", () => isHovered.value = true);\n useEventListener(el, \"mouseleave\", () => isHovered.value = false);\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { box = \"content-box\" } = options;\n const width = ref(initialSize.width);\n const height = ref(initialSize.height);\n useResizeObserver(target, ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (boxSize) {\n width.value = boxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = boxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }, options);\n watch(() => unrefElement(target), (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n });\n return {\n width,\n height\n };\n}\n\nfunction useElementVisibility(element, { window = defaultWindow, scrollTarget } = {}) {\n const elementIsVisible = ref(false);\n const testBounding = () => {\n if (!window)\n return;\n const document = window.document;\n const el = unrefElement(element);\n if (!el) {\n elementIsVisible.value = false;\n } else {\n const rect = el.getBoundingClientRect();\n elementIsVisible.value = rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) && rect.bottom >= 0 && rect.right >= 0;\n }\n };\n watch(() => unrefElement(element), () => testBounding(), { immediate: true, flush: \"post\" });\n if (window) {\n useEventListener(scrollTarget || window, \"scroll\", testBounding, {\n capture: false,\n passive: true\n });\n }\n return elementIsVisible;\n}\n\nconst events = new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || [];\n listeners.push(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n const index = listeners.indexOf(listener);\n if (index > -1)\n listeners.splice(index, 1);\n if (!listeners.length)\n events.delete(key);\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction useEventSource(url, events = [], options = {}) {\n const event = ref(null);\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const eventSource = ref(null);\n const error = ref(null);\n const {\n withCredentials = false\n } = options;\n const close = () => {\n if (eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n }\n };\n const es = new EventSource(url, { withCredentials });\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n eventSource,\n event,\n data,\n status,\n error,\n close\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = ref(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = resolveRef(newIcon);\n const applyIcon = (icon) => {\n document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`).forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(favicon, (i, o) => {\n if (isString(i) && i !== o)\n applyIcon(i);\n }, { immediate: true });\n return favicon;\n}\n\nvar __defProp$c = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$d = Object.getOwnPropertySymbols;\nvar __hasOwnProp$d = Object.prototype.hasOwnProperty;\nvar __propIsEnum$d = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$c = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$d.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n if (__getOwnPropSymbols$d)\n for (var prop of __getOwnPropSymbols$d(b)) {\n if (__propIsEnum$d.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\");\n}\nfunction isAbsoluteURL(url) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries([...headers.entries()]);\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n const callback = callbacks[callbacks.length - 1];\n if (callback !== void 0)\n await callback(ctx);\n return ctx;\n };\n } else {\n return async (ctx) => {\n await callbacks.reduce((prevCallback, callback) => prevCallback.then(async () => {\n if (callback)\n ctx = __spreadValues$c(__spreadValues$c({}, ctx), await callback(ctx));\n }), Promise.resolve());\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = resolveUnref(config.baseUrl);\n const targetUrl = resolveUnref(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = __spreadProps$3(__spreadValues$c(__spreadValues$c({}, options), args[0]), {\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n });\n } else {\n fetchOptions = __spreadProps$3(__spreadValues$c(__spreadValues$c({}, fetchOptions), args[0]), {\n headers: __spreadValues$c(__spreadValues$c({}, headersToObject(fetchOptions.headers) || {}), headersToObject(args[0].headers) || {})\n });\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = __spreadProps$3(__spreadValues$c(__spreadValues$c({}, options), args[1]), {\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n });\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = { immediate: true, refetch: false, timeout: 0 };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = __spreadValues$c(__spreadValues$c({}, options), args[0]);\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = __spreadValues$c(__spreadValues$c({}, options), args[1]);\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = ref(false);\n const isFetching = ref(false);\n const aborted = ref(false);\n const statusCode = ref(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort && controller)\n controller.abort();\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n const execute = async (throwOnFailed = false) => {\n var _a2;\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n controller = void 0;\n if (supportsAbort) {\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = __spreadProps$3(__spreadValues$c({}, fetchOptions), {\n signal: controller.signal\n });\n }\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n if (config.payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n const payload = resolveUnref(config.payload);\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: resolveUnref(url),\n options: __spreadValues$c(__spreadValues$c({}, defaultFetchOptions), fetchOptions),\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return new Promise((resolve, reject) => {\n var _a3;\n fetch(context.url, __spreadProps$3(__spreadValues$c(__spreadValues$c({}, defaultFetchOptions), context.options), {\n headers: __spreadValues$c(__spreadValues$c({}, headersToObject(defaultFetchOptions.headers)), headersToObject((_a3 = context.options) == null ? void 0 : _a3.headers))\n })).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse[config.type]();\n if (options.afterFetch && statusCode.value >= 200 && statusCode.value < 300)\n ({ data: responseData } = await options.afterFetch({ data: responseData, response: fetchResponse }));\n data.value = responseData;\n if (!fetchResponse.ok)\n throw new Error(fetchResponse.statusText);\n responseEvent.trigger(fetchResponse);\n return resolve(fetchResponse);\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError)\n ({ data: responseData, error: errorData } = await options.onFetchError({ data: responseData, error: fetchError, response: response.value }));\n data.value = responseData;\n error.value = errorData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n return reject(fetchError);\n return resolve(null);\n }).finally(() => {\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n });\n };\n const refetch = resolveRef(options.refetch);\n watch([\n refetch,\n resolveRef(url)\n ], ([refetch2]) => refetch2 && execute(), { deep: true });\n const shell = {\n isFinished,\n statusCode,\n response,\n error,\n data,\n isFetching,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch([\n refetch,\n resolveRef(config.payload)\n ], ([refetch2]) => refetch2 && execute(), { deep: true });\n }\n const rawPayload = resolveUnref(config.payload);\n if (!payloadType && rawPayload && Object.getPrototypeOf(rawPayload) === Object.prototype && !(rawPayload instanceof FormData))\n config.payloadType = \"json\";\n return __spreadProps$3(__spreadValues$c({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return __spreadProps$3(__spreadValues$c({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n }\n return void 0;\n };\n }\n if (options.immediate)\n setTimeout(execute, 0);\n return __spreadProps$3(__spreadValues$c({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n return `${start}/${end}`;\n return `${start}${end}`;\n}\n\nvar __defProp$b = Object.defineProperty;\nvar __getOwnPropSymbols$c = Object.getOwnPropertySymbols;\nvar __hasOwnProp$c = Object.prototype.hasOwnProperty;\nvar __propIsEnum$c = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$b = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$c.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n if (__getOwnPropSymbols$c)\n for (var prop of __getOwnPropSymbols$c(b)) {\n if (__propIsEnum$c.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n }\n return a;\n};\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\"\n};\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(null);\n let input;\n if (document) {\n input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n };\n }\n const open = (localOptions) => {\n if (!input)\n return;\n const _options = __spreadValues$b(__spreadValues$b(__spreadValues$b({}, DEFAULT_OPTIONS), options), localOptions);\n input.multiple = _options.multiple;\n input.accept = _options.accept;\n if (hasOwn(_options, \"capture\"))\n input.capture = _options.capture;\n input.click();\n };\n const reset = () => {\n files.value = null;\n if (input)\n input.value = \"\";\n };\n return {\n files: readonly(files),\n open,\n reset\n };\n}\n\nvar __defProp$a = Object.defineProperty;\nvar __getOwnPropSymbols$b = Object.getOwnPropertySymbols;\nvar __hasOwnProp$b = Object.prototype.hasOwnProperty;\nvar __propIsEnum$b = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$a = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n if (__getOwnPropSymbols$b)\n for (var prop of __getOwnPropSymbols$b(b)) {\n if (__propIsEnum$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n }\n return a;\n};\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = unref(options);\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = ref();\n const data = ref();\n const file = ref();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker(__spreadValues$a(__spreadValues$a({}, unref(options)), _options));\n fileHandle.value = handle;\n await updateFile();\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker(__spreadValues$a(__spreadValues$a({}, unref(options)), _options));\n data.value = void 0;\n await updateFile();\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker(__spreadValues$a(__spreadValues$a({}, unref(options)), _options));\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n if (unref(dataType) === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n if (unref(dataType) === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n if (unref(dataType) === \"Blob\")\n data.value = file.value;\n }\n watch(() => unref(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false } = options;\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed({\n get() {\n return isDef(activeElement.value) && isDef(targetElement.value) && activeElement.value === targetElement.value;\n },\n set(value) {\n var _a, _b;\n if (!value && focused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n if (value && !focused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus();\n }\n });\n watch(targetElement, () => {\n focused.value = initialValue;\n }, { immediate: true, flush: \"post\" });\n return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = ref(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst functionsMap = [\n [\n \"requestFullscreen\",\n \"exitFullscreen\",\n \"fullscreenElement\",\n \"fullscreenEnabled\",\n \"fullscreenchange\",\n \"fullscreenerror\"\n ],\n [\n \"webkitRequestFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitFullscreenElement\",\n \"webkitFullscreenEnabled\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"webkitRequestFullScreen\",\n \"webkitCancelFullScreen\",\n \"webkitCurrentFullScreenElement\",\n \"webkitCancelFullScreen\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"mozRequestFullScreen\",\n \"mozCancelFullScreen\",\n \"mozFullScreenElement\",\n \"mozFullScreenEnabled\",\n \"mozfullscreenchange\",\n \"mozfullscreenerror\"\n ],\n [\n \"msRequestFullscreen\",\n \"msExitFullscreen\",\n \"msFullscreenElement\",\n \"msFullscreenEnabled\",\n \"MSFullscreenChange\",\n \"MSFullscreenError\"\n ]\n];\nfunction useFullscreen(target, options = {}) {\n const { document = defaultDocument, autoExit = false } = options;\n const targetRef = target || (document == null ? void 0 : document.querySelector(\"html\"));\n const isFullscreen = ref(false);\n let map = functionsMap[0];\n const isSupported = useSupported(() => {\n if (!document) {\n return false;\n } else {\n for (const m of functionsMap) {\n if (m[1] in document) {\n map = m;\n return true;\n }\n }\n }\n return false;\n });\n const [REQUEST, EXIT, ELEMENT, , EVENT] = map;\n async function exit() {\n if (!isSupported.value)\n return;\n if (document == null ? void 0 : document[ELEMENT])\n await document[EXIT]();\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value)\n return;\n await exit();\n const target2 = unrefElement(targetRef);\n if (target2) {\n await target2[REQUEST]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n if (isFullscreen.value)\n await exit();\n else\n await enter();\n }\n if (document) {\n useEventListener(document, EVENT, () => {\n isFullscreen.value = !!(document == null ? void 0 : document[ELEMENT]);\n }, false);\n }\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n hapticActuators,\n index: gamepad.index,\n mapping: gamepad.mapping,\n connected: gamepad.connected,\n timestamp: gamepad.timestamp,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (let i = 0; i < _gamepads.length; ++i) {\n const gamepad = _gamepads[i];\n if (gamepad) {\n const index = gamepads.value.findIndex(({ index: index2 }) => index2 === gamepad.index);\n if (index > -1)\n gamepads.value[index] = stateFromGamepad(gamepad);\n }\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad));\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad));\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n if (_gamepads) {\n for (let i = 0; i < _gamepads.length; ++i) {\n const gamepad = _gamepads[i];\n if (gamepad)\n onGamepadConnected(gamepad);\n }\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = ref(null);\n const error = ref(null);\n const coords = ref({\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(updatePosition, (err) => error.value = err, {\n enableHighAccuracy,\n maximumAge,\n timeout\n });\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = ref(initialState);\n const lastActive = ref(timestamp());\n let timer;\n const onEvent = createFilterWrapper(eventFilter, () => {\n idle.value = false;\n lastActive.value = timestamp();\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n });\n if (window) {\n const document = window.document;\n for (const event of events)\n useEventListener(window, event, onEvent, { passive: true });\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n });\n }\n }\n timer = setTimeout(() => idle.value = true, timeout);\n return { idle, lastActive };\n}\n\nvar __defProp$9 = Object.defineProperty;\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$9 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n if (__getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(b)) {\n if (__propIsEnum$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n }\n return a;\n};\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes } = options;\n img.src = src;\n if (srcset)\n img.srcset = srcset;\n if (sizes)\n img.sizes = sizes;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nconst useImage = (options, asyncStateOptions = {}) => {\n const state = useAsyncState(() => loadImage(resolveUnref(options)), void 0, __spreadValues$9({\n resetOnExecute: true\n }, asyncStateOptions));\n watch(() => resolveUnref(options), () => state.execute(asyncStateOptions.delay), { deep: true });\n return state;\n};\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\"\n } = options;\n const internalX = ref(0);\n const internalY = ref(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c;\n const _element = resolveUnref(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = resolveUnref(_y)) != null ? _a : y.value,\n left: (_b = resolveUnref(_x)) != null ? _b : x.value,\n behavior: resolveUnref(behavior)\n });\n }\n const isScrolling = ref(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = useDebounceFn((e) => {\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n }, throttle + idle);\n const onScrollHandler = (e) => {\n const eventTarget = e.target === document ? e.target.documentElement : e.target;\n const scrollLeft = eventTarget.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalY.value;\n arrivedState.left = scrollLeft <= 0 + (offset.left || 0);\n arrivedState.right = scrollLeft + eventTarget.clientWidth >= eventTarget.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n internalX.value = scrollLeft;\n let scrollTop = eventTarget.scrollTop;\n if (e.target === document && !scrollTop)\n scrollTop = document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n arrivedState.top = scrollTop <= 0 + (offset.top || 0);\n arrivedState.bottom = scrollTop + eventTarget.clientHeight >= eventTarget.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n internalY.value = scrollTop;\n isScrolling.value = true;\n onScrollEnd(e);\n onScroll(e);\n };\n useEventListener(element, \"scroll\", throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler, eventListenerOptions);\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions\n };\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a, _b;\n const direction = (_a = options.direction) != null ? _a : \"bottom\";\n const state = reactive(useScroll(element, __spreadProps$2(__spreadValues$8({}, options), {\n offset: __spreadValues$8({\n [direction]: (_b = options.distance) != null ? _b : 0\n }, options.offset)\n })));\n watch(() => state.arrivedState[direction], async (v) => {\n var _a2, _b2;\n if (v) {\n const elem = resolveUnref(element);\n const previous = {\n height: (_a2 = elem == null ? void 0 : elem.scrollHeight) != null ? _a2 : 0,\n width: (_b2 = elem == null ? void 0 : elem.scrollWidth) != null ? _b2 : 0\n };\n await onLoadMore(state);\n if (options.preserveScrollPosition && elem) {\n nextTick(() => {\n elem.scrollTo({\n top: elem.scrollHeight - previous.height,\n left: elem.scrollWidth - previous.width\n });\n });\n }\n }\n });\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0.1,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n let cleanup = noop;\n const stopWatch = isSupported.value ? watch(() => ({\n el: unrefElement(target),\n root: unrefElement(root)\n }), ({ el, root: root2 }) => {\n cleanup();\n if (!el)\n return;\n const observer = new IntersectionObserver(callback, {\n root: root2,\n rootMargin,\n threshold\n });\n observer.observe(el);\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n }, { immediate: true, flush: \"post\" }) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = ref(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = new Set();\n const usedKeys = new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive: true });\n useEventListener(\"focus\", reset, { passive: true });\n const proxy = new Proxy(refs, {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.every((key) => unref(proxy[key])));\n } else {\n refs[prop] = ref(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? unref(r) : r;\n }\n });\n return proxy;\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nfunction usingElRef(source, cb) {\n if (resolveUnref(source))\n cb(resolveUnref(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n options = __spreadValues$7(__spreadValues$7({}, defaultOptions), options);\n const {\n document = defaultDocument\n } = options;\n const currentTime = ref(0);\n const duration = ref(0);\n const seeking = ref(false);\n const volume = ref(1);\n const waiting = ref(false);\n const ended = ref(false);\n const playing = ref(false);\n const rate = ref(1);\n const stalled = ref(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = ref(-1);\n const isPictureInPicture = ref(false);\n const muted = ref(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = isNumber(track) ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = isNumber(track) ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = resolveUnref(target);\n if (!el)\n return;\n const src = resolveUnref(options.src);\n let sources = [];\n if (!src)\n return;\n if (isString(src))\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n e.remove();\n });\n sources.forEach(({ src: src2, type }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.addEventListener(\"error\", sourceErrorEvent.trigger);\n el.appendChild(source);\n });\n el.load();\n });\n tryOnScopeDispose(() => {\n const el = resolveUnref(target);\n if (!el)\n return;\n el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n });\n watch(volume, (vol) => {\n const el = resolveUnref(target);\n if (!el)\n return;\n el.volume = vol;\n });\n watch(muted, (mute) => {\n const el = resolveUnref(target);\n if (!el)\n return;\n el.muted = mute;\n });\n watch(rate, (rate2) => {\n const el = resolveUnref(target);\n if (!el)\n return;\n el.playbackRate = rate2;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = resolveUnref(options.tracks);\n const el = resolveUnref(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = resolveUnref(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = resolveUnref(target);\n if (!el)\n return;\n isPlaying ? el.play() : el.pause();\n });\n useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = resolveUnref(target).currentTime));\n useEventListener(target, \"durationchange\", () => duration.value = resolveUnref(target).duration);\n useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(resolveUnref(target).buffered));\n useEventListener(target, \"seeking\", () => seeking.value = true);\n useEventListener(target, \"seeked\", () => seeking.value = false);\n useEventListener(target, \"waiting\", () => waiting.value = true);\n useEventListener(target, \"playing\", () => waiting.value = false);\n useEventListener(target, \"ratechange\", () => rate.value = resolveUnref(target).playbackRate);\n useEventListener(target, \"stalled\", () => stalled.value = true);\n useEventListener(target, \"ended\", () => ended.value = true);\n useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n useEventListener(target, \"volumechange\", () => {\n const el = resolveUnref(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n });\n const listeners = [];\n const stop = watch([target], () => {\n const el = resolveUnref(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n volume,\n muted,\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n onSourceError: sourceErrorEvent.on\n };\n}\n\nconst getMapVue2Compat = () => {\n const data = reactive({});\n return {\n get: (key) => data[key],\n set: (key, value) => set(data, key, value),\n has: (key) => hasOwn(data, key),\n delete: (key) => del(data, key),\n clear: () => {\n Object.keys(data).forEach((key) => {\n del(data, key);\n });\n }\n };\n};\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return reactive(options.cache);\n if (isVue2)\n return getMapVue2Compat();\n return reactive(new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nfunction useMounted() {\n const isMounted = ref(false);\n onMounted(() => {\n isMounted.value = true;\n });\n return isMounted;\n}\n\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n eventFilter\n } = options;\n const x = ref(initialValue.x);\n const y = ref(initialValue.y);\n const sourceType = ref(null);\n const mouseHandler = (event) => {\n if (type === \"page\") {\n x.value = event.pageX;\n y.value = event.pageY;\n } else if (type === \"client\") {\n x.value = event.clientX;\n y.value = event.clientY;\n } else if (type === \"movement\") {\n x.value = event.movementX;\n y.value = event.movementY;\n }\n sourceType.value = \"mouse\";\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const touch2 = event.touches[0];\n if (type === \"page\") {\n x.value = touch2.pageX;\n y.value = touch2.pageY;\n } else if (type === \"client\") {\n x.value = touch2.clientX;\n y.value = touch2.clientY;\n }\n sourceType.value = \"touch\";\n }\n };\n const mouseHandlerWrapper = (event) => {\n return eventFilter === void 0 ? mouseHandler(event) : eventFilter(() => mouseHandler(event), {});\n };\n const touchHandlerWrapper = (event) => {\n return eventFilter === void 0 ? touchHandler(event) : eventFilter(() => touchHandler(event), {});\n };\n if (window) {\n useEventListener(window, \"mousemove\", mouseHandlerWrapper, { passive: true });\n useEventListener(window, \"dragover\", mouseHandlerWrapper, { passive: true });\n if (touch && type !== \"movement\") {\n useEventListener(window, \"touchstart\", touchHandlerWrapper, { passive: true });\n useEventListener(window, \"touchmove\", touchHandlerWrapper, { passive: true });\n if (resetOnTouchEnds)\n useEventListener(window, \"touchend\", reset, { passive: true });\n }\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const { x, y, sourceType } = useMouse(options);\n const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = ref(0);\n const elementY = ref(0);\n const elementPositionX = ref(0);\n const elementPositionY = ref(0);\n const elementHeight = ref(0);\n const elementWidth = ref(0);\n const isOutside = ref(true);\n let stop = () => {\n };\n if (window) {\n stop = watch([targetRef, x, y], () => {\n const el = unrefElement(targetRef);\n if (!el)\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + window.pageXOffset;\n elementPositionY.value = top + window.pageYOffset;\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n }, { immediate: true });\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = ref(initialValue);\n const sourceType = ref(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => () => {\n pressed.value = true;\n sourceType.value = srcType;\n };\n const onReleased = () => {\n pressed.value = false;\n sourceType.value = null;\n };\n const target = computed(() => unrefElement(options.target) || window);\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"mouseleave\", onReleased, { passive: true });\n useEventListener(window, \"mouseup\", onReleased, { passive: true });\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"drop\", onReleased, { passive: true });\n useEventListener(window, \"dragend\", onReleased, { passive: true });\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true });\n useEventListener(window, \"touchend\", onReleased, { passive: true });\n useEventListener(window, \"touchcancel\", onReleased, { passive: true });\n }\n return {\n pressed,\n sourceType\n };\n}\n\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useMutationObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, mutationOptions = __objRest$1(_a, [\"window\"]);\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported.value && window && el) {\n observer = new MutationObserver(callback);\n observer.observe(el, mutationOptions);\n }\n }, { immediate: true });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst useNavigatorLanguage = (options = {}) => {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = ref(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n });\n return {\n isSupported,\n language\n };\n};\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = ref(true);\n const saveData = ref(false);\n const offlineAt = ref(void 0);\n const onlineAt = ref(void 0);\n const downlink = ref(void 0);\n const downlinkMax = ref(void 0);\n const rtt = ref(void 0);\n const effectiveType = ref(void 0);\n const type = ref(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n });\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n });\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, false);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline,\n saveData,\n offlineAt,\n onlineAt,\n downlink,\n downlinkMax,\n effectiveType,\n rtt,\n type\n };\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(b)) {\n if (__propIsEnum$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(new Date());\n const update = () => now.value = new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return __spreadValues$6({\n now\n }, controls);\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = ref();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(() => unref(object), (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n }, { immediate: true });\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, resolveUnref(min), resolveUnref(max));\n },\n set(value2) {\n _value.value = clamp(value2, resolveUnref(min), resolveUnref(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Infinity,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Infinity);\n const pageCount = computed(() => Math.max(1, Math.ceil(unref(total) / unref(currentPageSize))));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page))\n syncRef(page, currentPage);\n if (isRef(pageSize))\n syncRef(pageSize, currentPageSize);\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = ref(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n useEventListener(window, \"mouseout\", handler, { passive: true });\n useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n }\n return isLeft;\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))\n return \"deviceOrientation\";\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = -orientation.beta / 90;\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = orientation.gamma / 90;\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(b)) {\n if (__propIsEnum$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = ref(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n useEventListener(target, \"pointerdown\", handler, { passive: true });\n useEventListener(target, \"pointermove\", handler, { passive: true });\n useEventListener(target, \"pointerleave\", () => isInside.value = false, { passive: true });\n }\n return __spreadProps$1(__spreadValues$5({}, toRefs(state)), {\n isInside\n });\n}\n\nvar SwipeDirection;\n(function(SwipeDirection2) {\n SwipeDirection2[\"UP\"] = \"UP\";\n SwipeDirection2[\"RIGHT\"] = \"RIGHT\";\n SwipeDirection2[\"DOWN\"] = \"DOWN\";\n SwipeDirection2[\"LEFT\"] = \"LEFT\";\n SwipeDirection2[\"NONE\"] = \"NONE\";\n})(SwipeDirection || (SwipeDirection = {}));\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true,\n window = defaultWindow\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return SwipeDirection.NONE;\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? SwipeDirection.LEFT : SwipeDirection.RIGHT;\n } else {\n return diffY.value > 0 ? SwipeDirection.UP : SwipeDirection.DOWN;\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n let listenerOptions;\n const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n if (!passive)\n listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n else\n listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (listenerOptions.capture && !listenerOptions.passive)\n e.preventDefault();\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"touchend\", onTouchEnd, listenerOptions),\n useEventListener(target, \"touchcancel\", onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isPassiveEventSupported,\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop\n };\n}\nfunction checkPassiveEventSupport(document) {\n if (!document)\n return false;\n let supportsPassive = false;\n const optionsBlock = {\n get passive() {\n supportsPassive = true;\n return false;\n }\n };\n document.addEventListener(\"x\", noop, optionsBlock);\n document.removeEventListener(\"x\", noop);\n return supportsPassive;\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = resolveRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = ref(false);\n const isPointerDown = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return SwipeDirection.NONE;\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? SwipeDirection.LEFT : SwipeDirection.RIGHT;\n } else {\n return distanceY.value > 0 ? SwipeDirection.UP : SwipeDirection.DOWN;\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n var _a, _b;\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }),\n useEventListener(target, \"pointerup\", (e) => {\n var _a, _b;\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"initial\");\n })\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n });\n return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nconst useScreenOrientation = (options = {}) => {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = ref(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n });\n }\n const lockOrientation = (type) => {\n if (!isSupported.value)\n return Promise.reject(new Error(\"Not supported\"));\n return screenOrientation.lock(type);\n };\n const unlockOrientation = () => {\n if (isSupported.value)\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n};\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = ref(\"\");\n const right = ref(\"\");\n const bottom = ref(\"\");\n const left = ref(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update));\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = ref(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${resolveUnref(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = resolveUnref(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n el.addEventListener(\"error\", (event) => reject(event));\n el.addEventListener(\"abort\", (event) => reject(event));\n el.addEventListener(\"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n });\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${resolveUnref(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\") {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nfunction useScrollLock(element, initialState = false) {\n const isLocked = ref(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow;\n watch(resolveRef(element), (el) => {\n if (el) {\n const ele = el;\n initialOverflow = ele.style.overflow;\n if (isLocked.value)\n ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const ele = resolveUnref(element);\n if (!ele || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(ele, \"touchmove\", (e) => {\n preventDefault(e);\n }, { passive: false });\n }\n ele.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const ele = resolveUnref(element);\n if (!ele || !isLocked.value)\n return;\n isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());\n ele.style.overflow = initialOverflow;\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else\n unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = __spreadValues$4(__spreadValues$4({}, resolveUnref(shareOptions)), resolveUnref(overrideOptions));\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...unref(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(unref(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n window = defaultWindow\n } = options;\n const lang = resolveRef(options.lang || \"en-US\");\n const isListening = ref(false);\n const isFinal = ref(false);\n const result = ref(\"\");\n const error = shallowRef(void 0);\n const toggle = (value = !isListening.value) => {\n isListening.value = value;\n };\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n let recognition;\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = unref(lang);\n recognition.onstart = () => {\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const transcript = Array.from(event.results).map((result2) => {\n isFinal.value = result2.isFinal;\n return result2[0];\n }).map((result2) => result2.transcript).join(\"\");\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = unref(lang);\n };\n watch(isListening, () => {\n if (isListening.value)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n isListening.value = false;\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = ref(false);\n const status = ref(\"init\");\n const spokenText = resolveRef(text || \"\");\n const lang = resolveRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = unref(lang);\n utterance2.voice = unref(options.voice) || null;\n utterance2.pitch = pitch;\n utterance2.rate = rate;\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n utterance && synth.speak(utterance.value);\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n toggle,\n speak\n };\n}\n\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = resolveUnref(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => setTimeout(() => read(e), 0));\n if (storage) {\n watchWithFilter(data, async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n }, {\n flush,\n deep,\n eventFilter\n });\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = ref(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = ref(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.type = \"text/css\";\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(cssRef, (value) => {\n el.textContent = value;\n }, { immediate: true });\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(document.querySelector(selector), () => dir.value = getValue(), { attributes: true });\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n const ranges = new Array(rangeCount);\n for (let i = 0; i < rangeCount; i++) {\n const range = selection.getRangeAt(i);\n ranges[i] = range;\n }\n return ranges;\n}\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange);\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction useTextareaAutosize(options) {\n const textarea = ref(options == null ? void 0 : options.element);\n const input = ref(options == null ? void 0 : options.input);\n function triggerResize() {\n var _a, _b;\n if (!textarea.value)\n return;\n textarea.value.style.height = \"1px\";\n textarea.value.style.height = `${(_a = textarea.value) == null ? void 0 : _a.scrollHeight}px`;\n (_b = options == null ? void 0 : options.onResize) == null ? void 0 : _b.call(options);\n }\n watch([input, textarea], triggerResize, { immediate: true });\n useResizeObserver(textarea, () => triggerResize());\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, __spreadProps(__spreadValues$3({}, options), { eventFilter: filter }));\n return __spreadValues$3({}, history);\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Infinity, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nconst DEFAULT_FORMATTER = (date) => date.toISOString().slice(0, 10);\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const _a = useNow({ interval: updateInterval, controls: true }), { now } = _a, controls = __objRest(_a, [\"now\"]);\n const timeAgo = computed(() => formatTimeAgo(new Date(resolveUnref(time)), options, unref(now.value)));\n if (exposeControls) {\n return __spreadValues$2({\n timeAgo\n }, controls);\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, timeoutPollOptions) {\n const { start } = useTimeoutFn(loop, interval);\n const isActive = ref(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n loop();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = ref(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return __spreadValues$1({\n timestamp: ts\n }, controls);\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b;\n const {\n document = defaultDocument\n } = options;\n const title = resolveRef((_a = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _a : null);\n const isReadonly = newTitle && isFunction(newTitle);\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return isFunction(template) ? template(t) : unref(template).replace(/%s/g, t);\n }\n watch(title, (t, o) => {\n if (t !== o && document)\n document.title = format(isString(t) ? t : \"\");\n }, { immediate: true });\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver((_b = document.head) == null ? void 0 : _b.querySelector(\"title\"), () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n }, { childList: true });\n }\n return title;\n}\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = __spreadValues({\n linear: identity\n}, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction useTransition(source, options = {}) {\n const {\n delay = 0,\n disabled = false,\n duration = 1e3,\n onFinished = noop,\n onStarted = noop,\n transition = identity\n } = options;\n const currentTransition = computed(() => {\n const t = unref(transition);\n return isFunction(t) ? t : createEasingFunction(t);\n });\n const sourceValue = computed(() => {\n const s = unref(source);\n return isNumber(s) ? s : s.map(unref);\n });\n const sourceVector = computed(() => isNumber(sourceValue.value) ? [sourceValue.value] : sourceValue.value);\n const outputVector = ref(sourceVector.value.slice(0));\n let currentDuration;\n let diffVector;\n let endAt;\n let startAt;\n let startVector;\n const { resume, pause } = useRafFn(() => {\n const now = Date.now();\n const progress = clamp(1 - (endAt - now) / currentDuration, 0, 1);\n outputVector.value = startVector.map((val, i) => {\n var _a;\n return val + ((_a = diffVector[i]) != null ? _a : 0) * currentTransition.value(progress);\n });\n if (progress >= 1) {\n pause();\n onFinished();\n }\n }, { immediate: false });\n const start = () => {\n pause();\n currentDuration = unref(duration);\n diffVector = outputVector.value.map((n, i) => {\n var _a, _b;\n return ((_a = sourceVector.value[i]) != null ? _a : 0) - ((_b = outputVector.value[i]) != null ? _b : 0);\n });\n startVector = outputVector.value.slice(0);\n startAt = Date.now();\n endAt = startAt + currentDuration;\n resume();\n onStarted();\n };\n const timeout = useTimeoutFn(start, delay, { immediate: false });\n watch(sourceVector, () => {\n if (unref(disabled))\n return;\n if (unref(delay) <= 0)\n start();\n else\n timeout.start();\n }, { deep: true });\n watch(() => unref(disabled), (v) => {\n if (v) {\n outputVector.value = sourceVector.value.slice(0);\n pause();\n }\n });\n return computed(() => {\n const targetVector = unref(disabled) ? sourceVector : outputVector;\n return isNumber(sourceValue.value) ? targetVector.value[0] : targetVector.value;\n });\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(state, () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params);\n }, { deep: true });\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n window.history.replaceState(window.history.state, window.document.title, window.location.pathname + constructQuery(params));\n resume();\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true);\n }\n useEventListener(window, \"popstate\", onChanged, false);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, false);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n const videoDeviceId = ref(options.videoDeviceId);\n const audioDeviceId = ref(options.audioDeviceId);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(device) {\n if (device.value === \"none\" || device.value === false)\n return false;\n if (device.value == null)\n return true;\n return {\n deviceId: device.value\n };\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(videoDeviceId),\n audio: getDeviceOptions(audioDeviceId)\n });\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n watch([videoDeviceId, audioDeviceId], () => {\n if (autoSwitch.value && stream.value)\n restart();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n videoDeviceId,\n audioDeviceId,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c, _d, _e;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n let event = eventName;\n if (!key) {\n if (isVue2) {\n const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;\n key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n if (!eventName)\n event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n } else {\n key = \"modelValue\";\n }\n }\n event = eventName || event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : isFunction(clone) ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n watch(() => props[key], (v) => proxy.value = cloneFn(v));\n watch(proxy, (v) => {\n if (v !== props[key] || deep)\n _emit(event, v);\n }, { deep });\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n _emit(event, value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props)\n ret[key] = useVModel(props, key, emit, options);\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = resolveRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(vibrate, interval, {\n immediate: false,\n immediateCallback: false\n });\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = ref(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerHeight) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerHeight / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const height = itemSize(i);\n sum += height;\n if (sum >= containerHeight) {\n capacity = i;\n break;\n }\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, calculateRange) {\n watch([size.width, size.height, list], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\nconst useWakeLock = (options = {}) => {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n let wakeLock;\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = ref(false);\n async function onVisibilityChange() {\n if (!isSupported.value || !wakeLock)\n return;\n if (document && document.visibilityState === \"visible\")\n wakeLock = await navigator.wakeLock.request(\"screen\");\n isActive.value = !wakeLock.released;\n }\n if (document)\n useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n async function request(type) {\n if (!isSupported.value)\n return;\n wakeLock = await navigator.wakeLock.request(type);\n isActive.value = !wakeLock.released;\n }\n async function release() {\n if (!isSupported.value || !wakeLock)\n return;\n await wakeLock.release();\n isActive.value = !wakeLock.released;\n wakeLock = null;\n }\n return {\n isSupported,\n isActive,\n request,\n release\n };\n};\n\nconst useWebNotification = (defaultOptions = {}) => {\n const {\n window = defaultWindow\n } = defaultOptions;\n const isSupported = useSupported(() => !!window && \"Notification\" in window);\n const notification = ref(null);\n const requestPermission = async () => {\n if (!isSupported.value)\n return;\n if (\"permission\" in Notification && Notification.permission !== \"denied\")\n await Notification.requestPermission();\n };\n const onClick = createEventHook();\n const onShow = createEventHook();\n const onError = createEventHook();\n const onClose = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value)\n return;\n await requestPermission();\n const options = Object.assign({}, defaultOptions, overrides);\n notification.value = new Notification(options.title || \"\", options);\n notification.value.onclick = (event) => onClick.trigger(event);\n notification.value.onshow = (event) => onShow.trigger(event);\n notification.value.onerror = (event) => onError.trigger(event);\n notification.value.onclose = (event) => onClose.trigger(event);\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n tryOnMounted(async () => {\n if (isSupported.value)\n await requestPermission();\n });\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n};\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = ref(\"CLOSED\");\n const wsRef = ref();\n const urlRef = resolveRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let pongTimeoutWait;\n const close = (code = 1e3, reason) => {\n if (!wsRef.value)\n return;\n explicitlyClosed = true;\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n };\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed)\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n wsRef.value = void 0;\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === message)\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(() => {\n send(message, false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n }, pongTimeout);\n }, interval, { immediate: false });\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n useEventListener(window, \"beforeunload\", () => close());\n tryOnScopeDispose(close);\n }\n const open = () => {\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n watch(urlRef, open, { immediate: true });\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = function post2(val) {\n if (!worker.value)\n return;\n worker.value.postMessage(val);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (isString(arg0))\n worker.value = new Worker(arg0, workerOptions);\n else if (isFunction(arg0))\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nconst jobRunner = (userFunc) => (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n};\n\nconst depsParser = (deps) => {\n if (deps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n return `importScripts(${depsString})`;\n};\n\nconst createWorkerBlobUrl = (fn, deps) => {\n const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n};\n\nconst useWebWorkerFn = (fn, options = {}) => {\n const {\n dependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = ref(\"PENDING\");\n const promise = ref({});\n const timeoutId = ref();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(() => workerTerminate(\"TIMEOUT_EXPIRED\"), timeout);\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n promise.value = {\n resolve,\n reject\n };\n worker.value && worker.value.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\"[useWebWorkerFn] You can only run one instance of the worker at a time.\");\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n};\n\nfunction useWindowFocus({ window = defaultWindow } = {}) {\n if (!window)\n return ref(false);\n const focused = ref(window.document.hasFocus());\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n });\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n });\n return focused;\n}\n\nfunction useWindowScroll({ window = defaultWindow } = {}) {\n if (!window) {\n return {\n x: ref(0),\n y: ref(0)\n };\n }\n const x = ref(window.pageXOffset);\n const y = ref(window.pageYOffset);\n useEventListener(window, \"scroll\", () => {\n x.value = window.pageXOffset;\n y.value = window.pageYOffset;\n }, {\n capture: false,\n passive: true\n });\n return { x, y };\n}\n\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Infinity,\n initialHeight = Infinity,\n listenOrientation = true,\n includeScrollbar = true\n } = options;\n const width = ref(initialWidth);\n const height = ref(initialHeight);\n const update = () => {\n if (window) {\n if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n useEventListener(\"resize\", update, { passive: true });\n if (listenOrientation)\n useEventListener(\"orientationchange\", update, { passive: true });\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, SwipeDirection, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsMasterCss, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, cloneFnJSON, computedAsync, computedInject, createFetch, createUnrefFn, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useCloned, useColorMode, useConfirmDialog, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, usePermission, usePointer, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, useRafFn, useRefHistory, useResizeObserver, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","import { Component, ExtractPropTypes, shallowRef } from \"vue\";\nimport { defineStore } from \"pinia\";\n\nexport interface State {\n\tcomponents: Map;\n\tclickOutside: boolean;\n}\n\nexport const useModal = defineStore(\"modal-manager\", {\n\tstate: () =>\n\t\t({\n\t\t\tcomponents: new Map(),\n\t\t\tclickOutside: true,\n\t\t} as State),\n\tactions: {\n\t\topen(key: string, modal: Modal): void {\n\t\t\tmodal.component = shallowRef(modal.component);\n\t\t\tmodal.name = key;\n\n\t\t\tthis.components.set(key, modal);\n\t\t},\n\t\tclose(key: string): void {\n\t\t\tthis.components.delete(key);\n\t\t},\n\t},\n});\n\nexport interface Modal {\n\tcomponent: T;\n\tprops?: ExtractPropTypes;\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tevents?: { [key: string]: (...args: any[]) => void };\n\tname?: string;\n}\n\nexport interface ModalEvent {\n\tname: string;\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\targs: any[];\n}\n","\n\n\n\n\n","\n\n\n\n\n","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.32\n Copyright © 2012-2021 Faisal Salman \n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.32',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 350;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant |iemobile|slim)(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/ ]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq|duckduckgo)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 '+BROWSER]], [\n /(oculus|samsung|sailfish|huawei)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(metasr)[\\/ ]?([\\w\\.]+)/i, // SouGouBrowser\n /(lbbrowser)/i, // LieBao Browser\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w(\\.|\\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, VERSION]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\w ]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+)(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[12]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)( bui|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mitv-\\w{5}) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w ]*; *(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows) nt 6\\.2; (arm)/i, // Windows RT\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i, // Windows Phone\n /(windows)[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /(win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+ ([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser.major = majorize(_browser.version);\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","import { reactive } from \"vue\";\nimport { useQuery } from \"@vue/apollo-composable\";\nimport { defineStore } from \"pinia\";\nimport { LocalStorageKeys } from \"@store/lskeys\";\nimport { GetCosmetics } from \"@/apollo/query/cosmetics.query\";\nimport { ApolloError } from \"@apollo/client/errors\";\nimport { ImageFormat } from \"@/structures/Common\";\nimport { ActiveEmote, EmoteSet } from \"@/structures/EmoteSet\";\nimport { Permissions, Role } from \"@/structures/Role\";\nimport { User } from \"@/structures/User\";\nimport ModalError from \"@/components/modal/ModalError.vue\";\nimport { useModal } from \"./modal\";\nimport { IBrowser, UAParser, UAParserInstance } from \"ua-parser-js\";\n\nexport interface State {\n\tuser: User | null;\n\tactiveEmotes: Map;\n\teditableEmoteSets: Record;\n\tdefaultEmoteSetID: string;\n\tagent: UAParserInstance;\n\tpreferredFormat: ImageFormat;\n}\n\nexport const useActor = defineStore(\"actor\", {\n\tstate: () =>\n\t\t({\n\t\t\tuser: null,\n\t\t\tactiveEmotes: new Map(),\n\t\t\teditableEmoteSets: {},\n\t\t\tdefaultEmoteSetID: localStorage.getItem(LocalStorageKeys.DEFAULT_SET) ?? \"\",\n\t\t\tagent: new UAParser(),\n\t\t\tpreferredFormat: ImageFormat.WEBP,\n\t\t} as State),\n\tgetters: {\n\t\tid(): string {\n\t\t\treturn this.user?.id ?? \"\";\n\t\t},\n\t\thighestRole(): Role | null {\n\t\t\tif (!this.user) return null;\n\n\t\t\tconst roles = User.GetRoles(this.user);\n\t\t\treturn roles.reduce((prev, curr) => (prev.position > curr.position ? prev : curr), roles[0]);\n\t\t},\n\t\tdefaultEmoteSet(): EmoteSet | null {\n\t\t\tif (!this.user) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn this.editableEmoteSets[this.defaultEmoteSetID] ?? null;\n\t\t},\n\t\tconnections(): User.Connection[] {\n\t\t\tif (!this.user) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn this.user?.connections;\n\t\t},\n\t\tbrowser(): IBrowser {\n\t\t\treturn this.agent.getBrowser();\n\t\t},\n\t\tavifSupported(): boolean {\n\t\t\tconst version = parseInt(this.browser.version as string, 10);\n\t\t\tswitch (this.browser.name) {\n\t\t\t\tcase \"Chrome\":\n\t\t\t\t\treturn version >= 100;\n\t\t\t\tcase \"Firefox\":\n\t\t\t\t\treturn version >= 113;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tsetUser(user: User | Identity | null) {\n\t\t\tif (!(user as Identity)?._idty) {\n\t\t\t\tthis.user = user as User;\n\t\t\t} else if (user && (user as Identity)._idty) {\n\t\t\t\tthis.user = {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tdisplay_name: user.display_name,\n\t\t\t\t\tstyle: user.style,\n\t\t\t\t\tavatar_url: user.avatar_url,\n\t\t\t\t} as User;\n\t\t\t}\n\n\t\t\t// Update persisted identity\n\t\t\tif (user) {\n\t\t\t\tlocalStorage.setItem(\n\t\t\t\t\tLocalStorageKeys.IDENTITY,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\tdisplay_name: user.display_name,\n\t\t\t\t\t\tstyle: user.style,\n\t\t\t\t\t\tavatar_url: user.avatar_url,\n\t\t\t\t\t} as Identity),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlocalStorage.removeItem(LocalStorageKeys.IDENTITY);\n\t\t\t}\n\t\t},\n\t\tgetIdentity(): Identity | null {\n\t\t\tconst v = localStorage.getItem(LocalStorageKeys.IDENTITY);\n\t\t\tif (v) {\n\t\t\t\treturn JSON.parse(v);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tupdateUser(u: User) {\n\t\t\tif (!this.user) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (u.username !== this.user.username) {\n\t\t\t\tthis.user.username = u.username;\n\t\t\t}\n\t\t\tif (u.display_name !== this.user.display_name) {\n\t\t\t\tthis.user.display_name = u.display_name;\n\t\t\t}\n\t\t\tthis.user.connections = u.connections;\n\t\t\tif (typeof u.style.color === \"number\") {\n\t\t\t\tthis.user.style.color = u.style.color;\n\t\t\t}\n\t\t\tif (Array.isArray(u.roles)) {\n\t\t\t\tthis.user.roles = u.roles;\n\t\t\t}\n\t\t\tif (u.avatar_url !== this.user.avatar_url) {\n\t\t\t\tthis.user.avatar_url = u.avatar_url;\n\t\t\t}\n\t\t},\n\t\tupdateActiveEmotes() {\n\t\t\tthis.activeEmotes.clear();\n\t\t\tif (this.defaultEmoteSet && Array.isArray(this.defaultEmoteSet.emotes)) {\n\t\t\t\tthis.defaultEmoteSet.emotes.forEach((ae) => this.activeEmotes.set(ae.id, ae));\n\t\t\t}\n\t\t},\n\t\tsetDefaultEmoteSetID(id: string) {\n\t\t\tthis.activeEmotes.clear();\n\t\t\tif (id) {\n\t\t\t\tlocalStorage.setItem(LocalStorageKeys.DEFAULT_SET, id);\n\t\t\t\tthis.defaultEmoteSetID = id;\n\t\t\t\tthis.defaultEmoteSet?.emotes.forEach((ae) => this.activeEmotes.set(ae.id, ae));\n\t\t\t} else {\n\t\t\t\tlocalStorage.removeItem(LocalStorageKeys.DEFAULT_SET);\n\t\t\t\tthis.defaultEmoteSetID = \"\";\n\t\t\t}\n\t\t},\n\n\t\t// Editable Emote Sets\n\t\taddEmoteSet(set: EmoteSet) {\n\t\t\tthis.editableEmoteSets[set.id] = reactive(set);\n\t\t},\n\t\tupdateEmoteSet(d: EmoteSet) {\n\t\t\tconst set = this.getEmoteSet(d.id);\n\t\t\tif (!set) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Array.isArray(d.emotes)) {\n\t\t\t\tset.emotes = [...d.emotes];\n\t\t\t}\n\t\t\tthis.editableEmoteSets[set.id] = set;\n\t\t\tthis.updateActiveEmotes();\n\t\t},\n\t\tremoveEmoteSet(id: string) {\n\t\t\tdelete this.editableEmoteSets[id];\n\t\t},\n\t\tgetEmoteSet(id: string): EmoteSet | null {\n\t\t\treturn this.editableEmoteSets[id] ?? null;\n\t\t},\n\t\tgetActiveEmoteInSet(setID: string, emoteID: string): ActiveEmote | null {\n\t\t\treturn this.editableEmoteSets[setID]?.emotes?.filter((ae) => ae.id === emoteID)[0] ?? null;\n\t\t},\n\t\tgetActiveEmoteInSetByName(setID: string, name: string): ActiveEmote | null {\n\t\t\tconst set = this.getEmoteSet(setID);\n\t\t\tif (!set || !set.emotes?.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn set.emotes.find((ae) => ae.name === name) ?? null;\n\t\t},\n\t\tisEmoteSetFull(setID: string): boolean {\n\t\t\tconst set = this.getEmoteSet(setID);\n\t\t\tif (!set || !set.emotes) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn set.emotes.length >= set?.capacity;\n\t\t},\n\t\tmayEditUser(victim: User | null | undefined, asSelf?: boolean): boolean {\n\t\t\tif (!victim || !this.user) {\n\t\t\t\treturn false; // missing victim or actor\n\t\t\t}\n\t\t\tif (asSelf && victim.id === this.user.id) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn User.ComparePrivilege(this.user, victim);\n\t\t},\n\t\tmayEditRole(role: Role): boolean {\n\t\t\tif (!this.user || !this.highestRole) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.highestRole.position > role.position;\n\t\t},\n\t\tmayEditEmoteSet(set: EmoteSet): boolean {\n\t\t\tif (!this.user || !set) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (set.owner && set.owner.id === this.user.id) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (set.owner && this.hasEditorPermission(set.owner, User.EditorPermission.ManageEmoteSets)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\thasPermission(permission: bigint): boolean {\n\t\t\treturn User.HasPermission(this.user, permission);\n\t\t},\n\t\thasEditorPermission(u: User, permission: number): boolean {\n\t\t\tif (!this.user || !u) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.id === u.id || this.hasPermission(Permissions.ManageUsers)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst ed = this.user.editor_of?.find((e) => e.id === u.id);\n\t\t\tif (!ed) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn (permission & ed.permissions) === permission;\n\t\t},\n\n\t\tasync fetchCosmeticData(list: string[]): Promise {\n\t\t\tif (!list.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst { onResult, onError } = useQuery(GetCosmetics, { list });\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tonResult((res) => resolve(res.data));\n\t\t\t\tonError((err) => reject(err));\n\t\t\t});\n\t\t},\n\n\t\tshowErrorModal(error: ApolloError, ignoreCodes?: number[]) {\n\t\t\tconst modal = useModal();\n\n\t\t\tconst errs = error.graphQLErrors;\n\t\t\tconst er1 = errs[0];\n\n\t\t\tconst code = er1.extensions?.code as number;\n\t\t\tif (ignoreCodes?.includes(code)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst msg = er1.message.split(\":\")[0].replace(String(code), \"\").slice(1);\n\t\t\tconst detail = er1.message.split(/:(.*)/)[1];\n\n\t\t\tmodal.open(\"ErrorModal\", {\n\t\t\t\tcomponent: ModalError,\n\t\t\t\tevents: {},\n\t\t\t\tprops: {\n\t\t\t\t\terror: msg,\n\t\t\t\t\tdetail: detail,\n\t\t\t\t\tcode: code,\n\t\t\t\t\tgql: errs,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t},\n});\n\nexport interface Identity {\n\tid: string;\n\tdisplay_name: string;\n\tavatar_url: string;\n\tstyle: User.Style;\n\t_idty: boolean;\n}\n","import { RouteRecordRaw } from \"vue-router\";\nimport { useActor } from \"@/store/actor\";\nimport { Permissions } from \"@/structures/Role\";\nimport { User } from \"@/structures/User\";\n\nexport const UsersRoute = [\n\t{\n\t\tpath: \"/users/:user\",\n\t\tprops: true,\n\t\tmeta: { transition: \"fade\" },\n\t\tcomponent: () => import(\"@/views/context/UserContext.vue\"),\n\t\tchildren: [\n\t\t\t{\n\t\t\t\tpath: \"\",\n\t\t\t\tname: \"User\",\n\t\t\t\tcomponent: () => import(\"@/views/user/UserRoot.vue\"),\n\t\t\t\tchildren: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: \"\",\n\t\t\t\t\t\tname: \"UserOverview\",\n\t\t\t\t\t\tcomponent: () => import(\"@/views/user/UserOverview.vue\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: \"settings\",\n\t\t\t\t\t\tname: \"UserSettings\",\n\t\t\t\t\t\tcomponent: () => import(\"@/views/user/UserSettings.vue\"),\n\t\t\t\t\t\tbeforeEnter: (to, _, next) => {\n\t\t\t\t\t\t\tconst actor = useActor();\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tUser.HasPermission(actor.user, Permissions.ManageUsers) ||\n\t\t\t\t\t\t\t\tto.params.user === actor.user?.id\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnext(`/users/${to.params.user}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n] as RouteRecordRaw[];\n","import { RouteRecordRaw, createRouter, createWebHistory } from \"vue-router\";\nimport { AdminRoute } from \"./admin.route\";\nimport { ExtensionAuthRoute } from \"./auth.route\";\nimport { CallbackRoute } from \"./callback.route\";\nimport { EmoteSetRoute } from \"./emote-sets.route\";\nimport { EmotesRoute } from \"./emotes.route\";\nimport { HelpRoute } from \"./help.route\";\nimport { HomeRoute } from \"./home.route\";\nimport { LegalRoute } from \"./legal.route\";\nimport { StoreRoute } from \"./store.route\";\nimport { UsersRoute } from \"./users.route\";\n\nconst routes: Array = [\n\tHomeRoute,\n\t...EmotesRoute,\n\t...UsersRoute,\n\t...LegalRoute,\n\tEmoteSetRoute,\n\tStoreRoute,\n\tHelpRoute,\n\tAdminRoute,\n\t...CallbackRoute,\n\tExtensionAuthRoute,\n\t{\n\t\tpath: \"/:pathMatch(.*)*\",\n\t\tname: \"Not Found\",\n\t\tcomponent: () => import(\"@/views/404.vue\"),\n\t},\n];\n\nconst router = createRouter({\n\thistory: createWebHistory(import.meta.env.BASE_URL),\n\troutes,\n});\n\nexport default router;\n"],"names":["isVue2","activePinia","setActivePinia","pinia","piniaSymbol","isPlainObject","o","MutationType","createPinia","scope","effectScope","state","ref","_p","toBeInstalled","markRaw","app","plugin","noop","addSubscription","subscriptions","callback","detached","onCleanup","removeSubscription","idx","getCurrentScope","onScopeDispose","triggerSubscriptions","args","mergeReactiveObjects","target","patchToApply","value","key","subPatch","targetValue","isRef","isReactive","skipHydrateSymbol","shouldHydrate","obj","assign","isComputed","createOptionsStore","id","options","hot","actions","getters","initialState","store","setup","localState","toRefs","computedGetters","name","computed","createSetupStore","newState","$state","$id","isOptionsStore","optionsForPlugin","$subscribeOptions","isListening","isSyncListening","actionSubscriptions","debuggerEvents","activeListener","$patch","partialStateOrMutator","subscriptionMutation","myListenerId","nextTick","$reset","$dispose","wrapAction","action","afterCallbackList","onErrorCallbackList","after","onError","ret","error","partialStore","stopWatcher","watch","reactive","setupStore","prop","actionValue","toRaw","extender","defineStore","idOrOptions","setupOptions","isSetupStore","useStore","currentInstance","getCurrentInstance","inject","storeToRefs","refs","toRef","LocalStorageKeys","en_US","manifest","localeWL","k","m","v","getBrowserLocale","locale","setting","navigatorLocale","l","i18n","createI18n","correctLocale","splits","token","refresh","newTheme","now","newMode","newNavOpen","set","ae","a","b","roles","r","newLocale","AdminRoute","__vitePreload","ExtensionAuthRoute","CallbackRoute","EmoteSetRoute","to","from","next","namedSets","ok","val","EmotesRoute","HelpRoute","HomeRoute","LegalRoute","StoreRoute","_","GetCosmetics","gql","ImageFormat","getImage","host","format","size","file","fi","ObjectKind","RegExp","humanByteSize","decimals","sizes","i","Permissions","HasBits","sum","bit","HasBits64","User","user","uRoles","roleID","role","total","d","actor","victim","aRoles","vRoles","aPosition","vPosition","getStyledPlatformName","p","_a","isClient","isFunction","isString","resolveUnref","unref","createFilterWrapper","filter","fn","wrapper","resolve","reject","debounceFilter","ms","timer","maxTimer","lastRejector","_clearTimeout","timer2","invoke","duration","maxDuration","identity","arg","tryOnScopeDispose","useDebounceFn","refDebounced","debounced","updater","tryOnMounted","sync","onMounted","useIntervalFn","cb","interval","immediate","immediateCallback","isActive","clean","pause","resume","stopWatch","unrefElement","elRef","plain","defaultWindow","useEventListener","events","listeners","cleanups","cleanup","register","el","event","listener","stop","onClickOutside","handler","window","ignore","capture","detectIframe","shouldListen","fallback","shouldIgnore","target2","e","path","useSupported","isSupported","update","_global","globalKey","__getOwnPropSymbols$f","__hasOwnProp$f","__propIsEnum$f","__objRest$2","source","exclude","useResizeObserver","observerOptions","observer","useElementVisibility","element","scrollTarget","elementIsVisible","testBounding","document","rect","SwipeDirection","SwipeDirection2","__defProp","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","__defNormalProp","__spreadValues","_TransitionPresets","useModal","modal","shallowRef","props","__props","emit","__emit","modalEl","close","undefined","LIBVERSION","EMPTY","UNKNOWN","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","MAJOR","MODEL","NAME","TYPE","VENDOR","VERSION","ARCHITECTURE","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","EMBEDDED","UA_MAX_LENGTH","AMAZON","APPLE","ASUS","BLACKBERRY","BROWSER","CHROME","EDGE","FIREFOX","GOOGLE","HUAWEI","LG","MICROSOFT","MOTOROLA","OPERA","SAMSUNG","SHARP","SONY","XIAOMI","ZEBRA","FACEBOOK","extend","regexes","extensions","mergedRegexes","enumerize","arr","enums","has","str1","str2","lowerize","str","majorize","version","trim","len","rgxMapper","ua","arrays","j","q","matches","match","regex","strMapper","map","oldSafariMap","windowsVersionMap","UAParser","_ua","_rgxmap","_browser","_cpu","_device","_engine","_os","module","exports","parser","result","this","useActor","prev","curr","u","setID","emoteID","asSelf","permission","ed","list","onResult","useQuery","res","err","ignoreCodes","errs","er1","code","msg","detail","ModalError","UsersRoute","routes","router","createRouter","createWebHistory"],"mappings":"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"}