├── .gitattributes ├── .vscode └── extensions.json ├── .gitignore ├── public └── favicon.ico ├── src ├── main.ts ├── logic │ ├── index.ts │ ├── webz │ │ ├── README.md │ │ ├── calculateAlbumLayout.ts │ │ └── LICENSE │ ├── formatter.ts │ ├── models.ts │ ├── spoilers.ts │ └── markdown.ts ├── css │ ├── colors.sass │ └── global.sass ├── env.d.ts ├── index.ts ├── views │ ├── index.ts │ ├── VideoPlayer.vue │ ├── Location.vue │ ├── Poll.vue │ ├── AudioPlayer.vue │ ├── FileView.vue │ ├── ImageViewer.vue │ ├── PostView.vue │ └── TgBlog.vue ├── components.d.ts ├── App.vue └── auto-imports.d.ts ├── index.html ├── demo.local.html ├── tsconfig.json ├── demo.html ├── .github └── workflows │ └── github-pages-deploy.yml ├── LICENSE ├── package.json ├── vite.config.ts ├── README.md └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/one-among-us/tg-blog/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import {createApp} from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /src/logic/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./formatter" 2 | export * from "./models" 3 | export * from "./spoilers" 4 | export * from "./markdown" 5 | -------------------------------------------------------------------------------- /src/logic/webz/README.md: -------------------------------------------------------------------------------- 1 | These are files modified from [Telegram's Web Z client](https://github.com/Ajaxy/telegram-tt), with the GPLv3 license included in [LICENSE](./LICENSE). 2 | -------------------------------------------------------------------------------- /src/css/colors.sass: -------------------------------------------------------------------------------- 1 | $color-text-main: #70512a 2 | $color-text-light: rgba(166, 134, 89, 0.84) 3 | $color-text-special: #ff8373 4 | $color-text-special-dark: #ab4343 5 | 6 | // Lower means lighter 7 | $color-bg-6: #ffeedb 8 | $color-bg-5: #fff4eb 9 | $color-bg-card: #fdf9f1 10 | $color-bg-4: #fffcf9 11 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import {DefineComponent} from 'vue' 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 6 | const component: DefineComponent<{}, {}, any> 7 | export default component 8 | } 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import {App} from 'vue' 2 | import * as components from './views' 3 | import './css/global.sass' 4 | 5 | export default function install (app: App) { 6 | for (const key in components) { 7 | app.component(key, components[key]) 8 | } 9 | } 10 | 11 | export * from './views' 12 | export * from './logic' 13 | -------------------------------------------------------------------------------- /src/views/index.ts: -------------------------------------------------------------------------------- 1 | import TgBlog from "./TgBlog.vue" 2 | 3 | import AudioPlayer from "./AudioPlayer.vue" 4 | import FileView from "./FileView.vue" 5 | import PostView from "./PostView.vue" 6 | import ImageViewer from "./ImageViewer.vue"; 7 | 8 | export { 9 | TgBlog, AudioPlayer, FileView, PostView, ImageViewer 10 | } 11 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/logic/formatter.ts: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | 3 | export function durationFmt(duration: number): string 4 | { 5 | return moment.utc(moment.duration(duration, "seconds").asMilliseconds()).format("mm:ss") 6 | } 7 | 8 | export function sizeFmt(size: number): string 9 | { 10 | for (const unit of ["B", "KiB", "MiB", "GiB", "TiB", "PiB"]) 11 | { 12 | if (Math.abs(size) < 1024.0) 13 | { 14 | return `${size.toFixed(1)} ${unit}` 15 | } 16 | size /= 1024.0 17 | } 18 | return "> 1024 PiB" 19 | } 20 | -------------------------------------------------------------------------------- /src/views/VideoPlayer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 23 | 24 | 26 | -------------------------------------------------------------------------------- /demo.local.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | My Blog 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 |
22 | 23 |
24 | 25 | 26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "strict": false, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "esModuleInterop": true, 12 | "lib": ["esnext", "dom"], 13 | "baseUrl": ".", 14 | "paths": { 15 | "@/*": [ 16 | "src/*" 17 | ] 18 | }, 19 | 20 | "skipLibCheck": true, 21 | "emitDecoratorMetadata": true, 22 | "experimentalDecorators": true, 23 | "allowJs": true, 24 | 25 | "declaration": true, 26 | "emitDeclarationOnly": true, 27 | "declarationDir": "./dist/types", 28 | "types": [ 29 | "vite/client" 30 | ] 31 | }, 32 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] 33 | } 34 | -------------------------------------------------------------------------------- /demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | My Blog 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 |
22 | 23 |
24 | 25 | 26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /.github/workflows/github-pages-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Vite Deploy on Push 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | build: 10 | name: Build and deploy main 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 18 18 | cache: 'npm' 19 | 20 | - name: Install and build 21 | run: | 22 | yarn install 23 | # pass --base if CNAME is not used 24 | # npm run build -- --base=/${{ github.event.repository.name }}/ 25 | yarn build.demo 26 | 27 | # Enable Vue Router history mode with 404.html hack for Github Pages 28 | cd dist 29 | ln -s index.html 404.html 30 | 31 | - name: Deploy to github pages 32 | uses: JamesIves/github-pages-deploy-action@v4 33 | with: 34 | branch: gh-pages 35 | folder: dist 36 | -------------------------------------------------------------------------------- /src/components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-vue-components 5 | // Read more: https://github.com/vuejs/core/pull/3399 6 | export {} 7 | 8 | declare module 'vue' { 9 | export interface GlobalComponents { 10 | IEpArrowLeft: typeof import('~icons/ep/arrow-left')['default'] 11 | IEpArrowRight: typeof import('~icons/ep/arrow-right')['default'] 12 | IEpClose: typeof import('~icons/ep/close')['default'] 13 | IEpDownload: typeof import('~icons/ep/download')['default'] 14 | IFasAddressBook: typeof import('~icons/fa6-solid/address-book')['default'] 15 | IFasDownload: typeof import('~icons/fa6-solid/download')['default'] 16 | IFasEye: typeof import('~icons/fa6-solid/eye')['default'] 17 | IFasPlay: typeof import('~icons/fa6-solid/play')['default'] 18 | IIcRoundSearch: typeof import('~icons/ic/round-search')['default'] 19 | } 20 | export interface ComponentCustomProperties { 21 | vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll'] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 HyDEV 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tg-blog", 3 | "type": "module", 4 | "version": "1.1.8", 5 | "scripts": { 6 | "dev": "vite", 7 | "serve": "vite", 8 | "build": "rimraf dist && vue-tsc && vite build && UMD=1 vite build", 9 | "build.demo": "rimraf dist && vue-tsc && BUILD_DEMO=1 vite build", 10 | "lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src" 11 | }, 12 | "dependencies": { 13 | "@vue-leaflet/vue-leaflet": "0.8.4", 14 | "element-plus": "^2.2.26", 15 | "js-file-download": "^0.4.12", 16 | "keycode-js": "^3.1.0", 17 | "leaflet": "^1.9.3", 18 | "linkify-urls": "^4.0.0", 19 | "marked": "^4.2.3", 20 | "moment": "^2.29.4", 21 | "plyr": "^3.7.3", 22 | "sanitize-html": "^2.7.3", 23 | "url-join": "^5.0.0", 24 | "vue": "^3.2.33" 25 | }, 26 | "devDependencies": { 27 | "@iconify/json": "^2.1.154", 28 | "@types/marked": "^4.0.7", 29 | "@types/node": "^18.11.10", 30 | "@vitejs/plugin-vue": "^4.0.0", 31 | "rimraf": "^5.0.1", 32 | "sass": "^1.50.0", 33 | "typescript": "^5.1.6", 34 | "unplugin-auto-import": "^0.16.4", 35 | "unplugin-icons": "^0.16.3", 36 | "unplugin-vue-components": "^0.25.1", 37 | "vite": "^4.0.3", 38 | "vue": "^3.2.33", 39 | "vue-class-component": "^8.0.0-rc.1", 40 | "vue-property-decorator": "^10.0.0-rc.3", 41 | "vue-tsc": "^1.0.11" 42 | }, 43 | "files": [ 44 | "src", 45 | "dist" 46 | ], 47 | "types": "./dist/types/index.d.ts", 48 | "main": "./dist/tg-blog.umd.js", 49 | "module": "./dist/tg-blog.es.js", 50 | "exports": { 51 | ".": { 52 | "import": "./dist/tg-blog.es.js", 53 | "require": "./dist/tg-blog.umd.js" 54 | }, 55 | "./dist/style.css": "./dist/style.css" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/views/Location.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 44 | 45 | 61 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 52 | 53 | 63 | -------------------------------------------------------------------------------- /src/logic/models.ts: -------------------------------------------------------------------------------- 1 | export type MediaType = "audio_file" | "animation" | "video_file" | "sticker" | "voice_message" 2 | | "contact" | "poll" | "location" 3 | 4 | 5 | export interface Dimension { 6 | width: number 7 | height: number 8 | } 9 | 10 | export interface _Media { 11 | spoiler?: boolean 12 | size: number // Bytes 13 | thumb?: string 14 | } 15 | 16 | export interface Image extends Dimension, _Media { 17 | url: string 18 | } 19 | 20 | export interface PollOption { 21 | text: string 22 | voter_count: number 23 | data: string 24 | } 25 | 26 | export interface TGFile extends _Media { 27 | url: string 28 | mime_type: string 29 | media_type?: MediaType // If media_type is null, then it's not a media, just a regular file 30 | original_name?: string 31 | 32 | duration?: number 33 | width?: number 34 | height?: number 35 | sticker_emoji?: string 36 | title?: string 37 | performer?: string 38 | 39 | // For contact 40 | phone_number?: string 41 | first_name?: string 42 | last_name?: string 43 | } 44 | 45 | export interface TGPollFile { 46 | // For polls 47 | id?: string 48 | question?: string 49 | options?: PollOption[] 50 | total_voter_count?: number 51 | is_closed?: number 52 | is_anonymous?: number 53 | type?: "REGULAR" | "QUIZ" 54 | allow_multiple_answers?: boolean 55 | } 56 | 57 | export interface TGLocation 58 | { 59 | longitude: number 60 | latitude: number 61 | } 62 | 63 | export interface TGLocationFile extends TGLocation{ 64 | title: string 65 | address: string 66 | foursquare_id: string 67 | } 68 | 69 | export interface ForwardFrom { 70 | name: string 71 | url?: string 72 | } 73 | 74 | export interface Post { 75 | id: number 76 | date: string 77 | 78 | text?: string 79 | forwarded_from?: string | ForwardFrom 80 | type?: 'service' // If type is not service, it's a regular message 81 | views?: string // Service messages have no view count 82 | author?: string 83 | reply?: { 84 | id: number 85 | text: string 86 | thumb?: string 87 | } 88 | images?: Image[] 89 | files?: TGFile[] 90 | } 91 | // TODO: Other files types (i.e. pdf) 92 | // TODO: Video 93 | // TODO: Author 94 | -------------------------------------------------------------------------------- /src/logic/spoilers.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Find the parent element with the given class, or null if not found 3 | * 4 | * @param cls Class to find 5 | * @param el Child element 6 | */ 7 | function findParent(cls: string, el: Element): Element | null 8 | { 9 | // noinspection StatementWithEmptyBodyJS 10 | while ((el = el.parentElement) && !el.classList.contains(cls)); 11 | return el; 12 | } 13 | 14 | /** 15 | * Find the parent element with the given tag, or null if not found 16 | * 17 | * @param tag 18 | * @param el 19 | */ 20 | function findParentByTag(tag: string, el: Element): Element | null 21 | { 22 | // noinspection StatementWithEmptyBodyJS 23 | while ((el = el.parentElement) && el.tagName.toLowerCase() != tag); 24 | return el; 25 | } 26 | 27 | /** 28 | * Initialize clickable spoilers on the page 29 | */ 30 | export function initSpoilers() 31 | { 32 | const spoilers = document.querySelectorAll('.spoiler') 33 | 34 | console.log("Spoilers initialized.") 35 | 36 | spoilers.forEach(spoiler => 37 | { 38 | // Already initialized 39 | if (spoiler.classList.contains("spoiler-init")) return 40 | spoiler.classList.add("spoiler-init") 41 | 42 | // Toggle all spoilers at once if they are in the same post 43 | const post = findParent("post", spoiler) 44 | const siblingSpoilers = post?.querySelectorAll(".spoiler") 45 | 46 | function handleSpoiler() 47 | { 48 | spoiler.classList.toggle("spoiler-visible") 49 | console.log(`Spoiler clicked: ${spoiler}`); 50 | 51 | // Toggle sibling spoilers if they are in the same post 52 | if (post) siblingSpoilers?.forEach(it => 53 | { 54 | if (it != spoiler) it.classList.toggle("spoiler-visible") 55 | }) 56 | } 57 | 58 | // If the spoiler is wrapped in a link, handle link clicks specially 59 | const link = findParentByTag("a", spoiler) 60 | if (link) 61 | { 62 | link.addEventListener('click', (e) => 63 | { 64 | // If the spoiler is already visible, let the link work as normal 65 | if (spoiler.classList.contains("spoiler-visible")) return 66 | 67 | // If not, treat the click as a spoiler click 68 | handleSpoiler() 69 | e.preventDefault() 70 | }) 71 | 72 | return 73 | } 74 | 75 | // Add event listener 76 | spoiler.addEventListener('click', handleSpoiler) 77 | }) 78 | } 79 | -------------------------------------------------------------------------------- /src/views/Poll.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 47 | 48 | 93 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import {defineConfig, PluginOption, UserConfigExport} from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import path from 'path' 4 | import AutoImport from 'unplugin-auto-import/vite' 5 | import Components from 'unplugin-vue-components/vite' 6 | import Icons from 'unplugin-icons/vite' 7 | import IconsResolver from 'unplugin-icons/resolver' 8 | import {ElementPlusResolver} from "unplugin-vue-components/resolvers"; 9 | 10 | 11 | const src = path.resolve(__dirname, 'src') 12 | 13 | const autoImport: PluginOption[] = [ 14 | AutoImport({ 15 | // Auto import functions from Vue, e.g. ref, reactive, toRef... 16 | // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 17 | imports: ['vue'], 18 | 19 | // Auto import functions from Element Plus, e.g. ElMessage, ElMessageBox... (with style) 20 | // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) 21 | resolvers: [ 22 | ElementPlusResolver(), 23 | ], 24 | 25 | dts: path.resolve(src, 'auto-imports.d.ts'), 26 | }), 27 | 28 | Components({ 29 | resolvers: [ 30 | // Auto register Element Plus components 31 | // 自动导入 Element Plus 组件 32 | ElementPlusResolver(), 33 | 34 | // Auto register icon components 35 | // 自动注册图标组件 36 | IconsResolver({ 37 | prefix: 'i', 38 | enabledCollections: ['ep', 'fa6-solid', 'ic'], 39 | alias: { 40 | fas: 'fa6-solid', 41 | } 42 | }), 43 | ], 44 | 45 | dts: path.resolve(src, 'components.d.ts'), 46 | }), 47 | 48 | Icons({ 49 | autoInstall: true 50 | }) 51 | ] 52 | 53 | const umd = !!process.env.UMD 54 | const demo = !!process.env.BUILD_DEMO 55 | 56 | // https://vitejs.dev/config/ 57 | const cfg: UserConfigExport = { 58 | define: { 59 | 'process.env': {} 60 | }, 61 | plugins: [vue(), ...autoImport], 62 | resolve: { 63 | alias: {'@': src}, 64 | }, 65 | build: demo ? {} : { 66 | lib: { 67 | entry: path.resolve(src, 'index.ts'), 68 | name: 'TgBlog', 69 | formats: umd ? ['umd'] : ['es', 'cjs'], 70 | fileName: (format) => `tg-blog.${format}.js`, 71 | }, 72 | rollupOptions: { 73 | // external modules won't be bundled into your library 74 | external: ['vue'], // not every external has a global 75 | output: { 76 | // disable warning on src/index.ts using both default and named export 77 | exports: 'named', 78 | // Provide global variables to use in the UMD build 79 | // for externalized deps (not useful if 'umd' is not in lib.formats) 80 | globals: { 81 | vue: 'Vue', 82 | }, 83 | inlineDynamicImports: umd, 84 | }, 85 | }, 86 | sourcemap: true, 87 | emptyOutDir: false, // to retain the types folder generated by tsc 88 | }, 89 | } 90 | 91 | export default defineConfig(cfg) 92 | -------------------------------------------------------------------------------- /src/logic/markdown.ts: -------------------------------------------------------------------------------- 1 | import {marked} from "marked"; 2 | import sanitizeHtml from 'sanitize-html'; 3 | 4 | /** 5 | * Spoiler markdown extension 6 | */ 7 | const spoilerExtension = { 8 | name: 'spoiler', 9 | level: 'inline', 10 | start(src) { 11 | return src.match(/\|\|(?!\s)/)?.index; 12 | }, 13 | tokenizer(src) { 14 | const rule = /^\|\|(?!\s)([^\n]+)(?!\s)\|\|/; 15 | const match = rule.exec(src); 16 | 17 | if (match) { 18 | // console.log(src, match) 19 | return {type: 'spoiler', raw: match[0], inner: this.lexer.inlineTokens(match[1].trim())}; 20 | } 21 | }, 22 | renderer(token) { 23 | return `${this.parser.parseInline(token.inner)}`; 24 | } 25 | }; 26 | 27 | const underlineExtension = { 28 | name: 'underline', 29 | level: 'inline', 30 | start(src) { 31 | return src.match(/--(?!\s)/)?.index; 32 | }, 33 | tokenizer(src) { 34 | const rule = /^--(?!\s)([^\n]+)(?!\s)--/; 35 | const match = rule.exec(src); 36 | if (match) { 37 | return { 38 | type: 'underline', 39 | raw: match[0], 40 | inner: this.lexer.inlineTokens(match[1].trim()) 41 | } 42 | } 43 | }, 44 | renderer(token) { 45 | return `${this.parser.parseInline(token.inner)}`; 46 | } 47 | } 48 | 49 | marked.use({extensions: [spoilerExtension, underlineExtension]}); 50 | 51 | /** 52 | * SanitizeHTML options 53 | */ 54 | const sanitizeOptions: sanitizeHtml.IOptions = { 55 | allowedTags: [ 56 | "address", "article", "aside", "footer", "header", "h1", "h2", "h3", "h4", 57 | "h5", "h6", "hgroup", "main", "nav", "section", "blockquote", "dd", "div", 58 | "dl", "dt", "figcaption", "figure", "hr", "li", "main", "ol", "p", "pre", 59 | "ul", "a", "abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", 60 | "em", "i", "kbd", "mark", "q", "rb", "rp", "rt", "rtc", "ruby", "s", "samp", 61 | "small", "span", "strong", "sub", "sup", "time", "u", "var", "wbr", "caption", 62 | "col", "colgroup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", 63 | 64 | "img", "del" 65 | ], 66 | disallowedTagsMode: 'discard', 67 | allowedAttributes: { 68 | a: ['href', 'name', 'target'], 69 | img: ['src', 'srcset', 'alt', 'title', 'width', 'height', 'loading'], 70 | i: ['emoji-src', 'emoji-orig'] 71 | }, 72 | allowedClasses: { 73 | span: ['spoiler'], 74 | i: ['custom-emoji'] 75 | }, 76 | selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta' ], 77 | allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ], 78 | allowedSchemesByTag: {}, 79 | allowedSchemesAppliedToAttributes: [ 'href', 'src', 'cite' ], 80 | allowProtocolRelative: true, 81 | enforceHtmlBoundary: false 82 | } 83 | 84 | export function sanitize(html: string) { return sanitizeHtml(html, sanitizeOptions) } 85 | export function mdParseInline(s: string) { return sanitize(marked.parseInline(s)) } 86 | export function mdParse(s: string) { return sanitize(marked.parse(s)) } 87 | -------------------------------------------------------------------------------- /src/css/global.sass: -------------------------------------------------------------------------------- 1 | @import colors 2 | 3 | // Constants 4 | $font: "Noto Sans SC", Avenir, Helvetica, Arial, sans-serif 5 | 6 | // Container width (This is normally 50vw, 7 | // but when it's smaller than 900px, use 100vw - 50px, because 50px is the margin) 8 | $app-width: max(50vw, min(900px, 100vw - 50px)) 9 | $c-highlight: #ff7878 10 | 11 | // Highlight color 12 | .color-highlight 13 | color: $c-highlight 14 | 15 | // Non-selectable text 16 | @mixin unselectable 17 | -webkit-touch-callout: none 18 | -webkit-user-select: none 19 | -khtml-user-select: none 20 | -moz-user-select: none 21 | -ms-user-select: none 22 | user-select: none 23 | 24 | .unselectable 25 | @include unselectable 26 | 27 | @mixin undraggable 28 | user-drag: none 29 | -webkit-user-drag: none 30 | @include unselectable 31 | 32 | .undraggable 33 | @include undraggable 34 | 35 | img 36 | @include undraggable 37 | 38 | // Clickable text 39 | .clickable:hover 40 | cursor: pointer 41 | @include unselectable 42 | 43 | // Vertical flex 44 | .fbox-v 45 | display: flex 46 | flex-flow: column 47 | height: 100% 48 | 49 | .mh0 50 | min-height: 0 51 | 52 | // Horizontal flex 53 | .fbox-h 54 | display: flex 55 | flex-flow: row 56 | 57 | .mw0 58 | min-width: 0 59 | 60 | // Flex properties 61 | .f-no-grow 62 | flex-grow: 0 63 | 64 | .f-grow1 65 | flex-grow: 1 66 | 67 | .f-no-shrink 68 | flex-shrink: 0 69 | 70 | .f-shrink1 71 | flex-shrink: 1 72 | 73 | // Expand in the vertical direction 74 | .f-v-expand 75 | flex: 1 0 76 | min-height: 0 77 | 78 | // Expand in the horizontal direction 79 | .f-h-expand 80 | flex: 1 0 81 | min-width: 0 82 | 83 | .h100 84 | height: 100% 85 | 86 | .w100 87 | width: 100% 88 | 89 | // Vertical Flex Center 90 | @mixin flex-vcenter 91 | display: flex 92 | flex-flow: column 93 | justify-content: center 94 | 95 | // Center both horizontally and vertically 96 | .fbox-center 97 | @include flex-vcenter 98 | align-items: center 99 | 100 | // Center vertically only 101 | .fbox-vcenter 102 | @include flex-vcenter 103 | 104 | // No wrap text 105 | .nowrap 106 | overflow: hidden 107 | white-space: nowrap 108 | text-overflow: clip 109 | 110 | .nowrap.e 111 | text-overflow: ellipsis 112 | 113 | #page-desc 114 | margin-bottom: 20px 115 | 116 | .tgb-card 117 | width: 100% 118 | background: $color-bg-card 119 | border-radius: 20px 120 | margin-bottom: 20px 121 | padding: 10px 20px 122 | overflow: auto 123 | overflow-x: hidden 124 | box-sizing: border-box 125 | box-shadow: var(--tgb-shadow) 126 | 127 | body 128 | --tgb-shadow: 0 4px 6px -1px rgb(0 0 0 / 12%), 0 2px 4px -1px rgb(0 0 0 / 8%) 129 | 130 | .spoiler 131 | @include unselectable 132 | cursor: pointer 133 | transition: all .4s ease 134 | background-color: $color-text-light 135 | margin: 0 1px 136 | border-radius: 3px 137 | 138 | span 139 | opacity: 0 140 | 141 | .spoiler.spoiler-visible 142 | background-color: transparent 143 | 144 | span 145 | filter: blur(0) 146 | opacity: 1 147 | -------------------------------------------------------------------------------- /src/views/AudioPlayer.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 90 | 91 | 121 | -------------------------------------------------------------------------------- /src/auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-auto-import 5 | export {} 6 | declare global { 7 | const EffectScope: typeof import('vue')['EffectScope'] 8 | const computed: typeof import('vue')['computed'] 9 | const createApp: typeof import('vue')['createApp'] 10 | const customRef: typeof import('vue')['customRef'] 11 | const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] 12 | const defineComponent: typeof import('vue')['defineComponent'] 13 | const effectScope: typeof import('vue')['effectScope'] 14 | const getCurrentInstance: typeof import('vue')['getCurrentInstance'] 15 | const getCurrentScope: typeof import('vue')['getCurrentScope'] 16 | const h: typeof import('vue')['h'] 17 | const inject: typeof import('vue')['inject'] 18 | const isProxy: typeof import('vue')['isProxy'] 19 | const isReactive: typeof import('vue')['isReactive'] 20 | const isReadonly: typeof import('vue')['isReadonly'] 21 | const isRef: typeof import('vue')['isRef'] 22 | const markRaw: typeof import('vue')['markRaw'] 23 | const nextTick: typeof import('vue')['nextTick'] 24 | const onActivated: typeof import('vue')['onActivated'] 25 | const onBeforeMount: typeof import('vue')['onBeforeMount'] 26 | const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] 27 | const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] 28 | const onDeactivated: typeof import('vue')['onDeactivated'] 29 | const onErrorCaptured: typeof import('vue')['onErrorCaptured'] 30 | const onMounted: typeof import('vue')['onMounted'] 31 | const onRenderTracked: typeof import('vue')['onRenderTracked'] 32 | const onRenderTriggered: typeof import('vue')['onRenderTriggered'] 33 | const onScopeDispose: typeof import('vue')['onScopeDispose'] 34 | const onServerPrefetch: typeof import('vue')['onServerPrefetch'] 35 | const onUnmounted: typeof import('vue')['onUnmounted'] 36 | const onUpdated: typeof import('vue')['onUpdated'] 37 | const provide: typeof import('vue')['provide'] 38 | const reactive: typeof import('vue')['reactive'] 39 | const readonly: typeof import('vue')['readonly'] 40 | const ref: typeof import('vue')['ref'] 41 | const resolveComponent: typeof import('vue')['resolveComponent'] 42 | const shallowReactive: typeof import('vue')['shallowReactive'] 43 | const shallowReadonly: typeof import('vue')['shallowReadonly'] 44 | const shallowRef: typeof import('vue')['shallowRef'] 45 | const toRaw: typeof import('vue')['toRaw'] 46 | const toRef: typeof import('vue')['toRef'] 47 | const toRefs: typeof import('vue')['toRefs'] 48 | const toValue: typeof import('vue')['toValue'] 49 | const triggerRef: typeof import('vue')['triggerRef'] 50 | const unref: typeof import('vue')['unref'] 51 | const useAttrs: typeof import('vue')['useAttrs'] 52 | const useCssModule: typeof import('vue')['useCssModule'] 53 | const useCssVars: typeof import('vue')['useCssVars'] 54 | const useSlots: typeof import('vue')['useSlots'] 55 | const watch: typeof import('vue')['watch'] 56 | const watchEffect: typeof import('vue')['watchEffect'] 57 | const watchPostEffect: typeof import('vue')['watchPostEffect'] 58 | const watchSyncEffect: typeof import('vue')['watchSyncEffect'] 59 | } 60 | // for type re-export 61 | declare global { 62 | // @ts-ignore 63 | export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue' 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tg-blog: Display Telegram Channel on Web Page 2 | 3 | This is a front-end for displaying telegram (or any compatible) channel data as an interactive web page. The data format is specified in [models.ts](src/logic/models.ts), and can be generated using [TelegramBackup](https://github.com/one-among-us/TelegramBackup). 4 | 5 | Demo: https://test-tg.one-among.us/test 6 | You can also check out [Azalea's Blog](https://aza.moe/life) for a demo. 7 | 8 | ## Support Status 9 | 10 | ### Feature Support 11 | 12 | - [x] All text formatting (including spoilers) 13 | - [x] @username, #hashtag 14 | - [x] Forwarded from, reply to (clickable) 15 | - [x] Maps! (location sharing) 16 | - [x] Polls (show result only, unable to vote) 17 | - [x] Contacts 18 | - [x] Search, hashtag search 19 | 20 | ### Media Support 21 | 22 | - [x] Stickers, Animated stickers (webm & tgs) 23 | - [x] Custom emojis, animated custom emojis 24 | - [x] Videos, gif animations 25 | - [x] Files 26 | - [x] Audio, voice message (Including an audio player) 27 | - [x] Media groups 28 | - [x] Image viewing & tiling 29 | - [x] Media spoilers (image, video, gif) 30 | 31 | ## Getting Started 32 | 33 | ### Use in Plain HTML 34 | 35 | You can use it in plain HTML without a modern web build tool: 36 | 37 | ```html 38 | 39 | 40 | My Blog 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 51 | 52 | 53 | 54 |
55 | 56 |
57 | 58 | 59 | 62 | 63 | 64 | ``` 65 | 66 | ### Use in Hexo Blog 67 | 68 | You can also use it in a Hexo blog like in [Linda's Blog](https://blog.1mether.me/tg-channel) ([source code](https://github.com/locoda/blog/blob/master/source/tg-channel.md?plain=1)) 69 | 70 | Depending on the css of your theme, it might need some modifications to work. For example, [these modifications](https://github.com/locoda/blog/pull/66) were needed for the Icalm theme. 71 | 72 | However, you can add the page as a markdown in the following format: 73 | 74 | ```md 75 | --- 76 | title: 'Telegram Blog' 77 | date: 2023-01-13 78 | --- 79 | 80 | {% raw %} 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 98 | 99 | 100 |
101 | 102 |
103 | 104 | 105 | 118 | 119 | {% endraw %} 120 | ``` 121 | 122 | ### Use in Vite 123 | 124 | You can also use import it into your project using modern build tools like vite: 125 | 126 | #### 1. Install dependencies 127 | 128 | ``` 129 | yarn add tg-blog 130 | ``` 131 | 132 | #### 2. Import CSS in your `main.ts` 133 | 134 | ```ts 135 | import {createApp, h} from 'vue' 136 | import App from './App.vue' 137 | // Add this: 138 | import 'tg-blog/dist/style.css' 139 | ``` 140 | 141 | #### 3. In your `vite.config.ts`, you shall configure to dedupe `vue` 142 | 143 | ```ts 144 | export default defineConfig({ 145 | resolve: { 146 | dedupe: ['vue'], 147 | }, 148 | }); 149 | ``` 150 | 151 | #### 4. Import components 152 | 153 | ```ts 154 | import { TgBlog } from 'tg-blog'; 155 | 156 | // If you're using Vue-TS Class Component, then add this: 157 | @Options({components: { TgBlog }}) 158 | export default class ... 159 | ``` 160 | 161 | ## Component Documentation 162 | 163 | ### TgBlog 164 | 165 | There is only one option that you need to specify: `posts-url`, which should point to the `posts.json` of your blog data. 166 | 167 | You can generate `posts.json` using [TelegramBackup](https://github.com/one-among-us/TelegramBackup) 168 | 169 | ```vue 170 | 171 | ``` 172 | 173 | #### Props 174 | 175 | | Prop | Description | 176 | |-------------|-----------------------------------------------| 177 | | `posts-url` | HTTP Link to your blog data `posts.json` file | 178 | 179 | ### ImageViewer (Internal) 180 | 181 | If you only want the image viewer functionality, you can import this module. 182 | 183 | TODO: Write more documentation 184 | 185 | -------------------------------------------------------------------------------- /src/views/FileView.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 141 | 142 | 212 | -------------------------------------------------------------------------------- /src/views/ImageViewer.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 134 | 135 | 259 | 260 | 265 | -------------------------------------------------------------------------------- /src/views/PostView.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 149 | 150 | 256 | 257 | 281 | -------------------------------------------------------------------------------- /src/views/TgBlog.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 308 | 309 | 379 | -------------------------------------------------------------------------------- /src/logic/webz/calculateAlbumLayout.ts: -------------------------------------------------------------------------------- 1 | // Modified from: https://github.com/Ajaxy/telegram-tt/blob/master/src/components/middle/message/helpers/calculateAlbumLayout.ts 2 | 3 | import {Dimension, Image} from "@/logic"; 4 | 5 | export const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10); 6 | export const clamp = (num: number, min: number, max: number) => (Math.min(max, Math.max(min, num))); 7 | 8 | export const AlbumRectPart = { 9 | None: 0, 10 | Top: 1, 11 | Right: 2, 12 | Bottom: 4, 13 | Left: 8, 14 | }; 15 | 16 | type IAttempt = { 17 | lineCounts: number[]; 18 | heights: number[]; 19 | }; 20 | export type IMediaDimensions = { 21 | width: number; 22 | height: number; 23 | x: number; 24 | y: number; 25 | }; 26 | type IMediaLayout = { 27 | dimensions: IMediaDimensions; 28 | sides: number; 29 | }; 30 | type ILayoutParams = { 31 | ratios: number[]; 32 | proportions: string; 33 | averageRatio: number; 34 | maxWidth: number; 35 | minWidth: number; 36 | maxHeight: number; 37 | spacing: number; 38 | }; 39 | export type IAlbumLayout = { 40 | layout: IMediaLayout[]; 41 | containerStyle: Dimension; 42 | }; 43 | 44 | function getProportions(ratios: number[]) { 45 | return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join(''); 46 | } 47 | 48 | function getAverageRatio(ratios: number[]) { 49 | return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length; 50 | } 51 | 52 | function accumulate(list: number[], initValue: number) { 53 | return list.reduce((accumulator, item) => accumulator + item, initValue); 54 | } 55 | 56 | function cropRatios(ratios: number[], averageRatio: number) { 57 | return ratios.map((ratio) => { 58 | return (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)); 59 | }); 60 | } 61 | 62 | function calculateContainerSize(layout: IMediaLayout[]) { 63 | const styles: Dimension = { width: 0, height: 0 }; 64 | layout.forEach(({ 65 | dimensions, 66 | sides, 67 | }) => { 68 | if (sides & AlbumRectPart.Right) { 69 | styles.width = dimensions.width + dimensions.x; 70 | } 71 | if (sides & AlbumRectPart.Bottom) { 72 | styles.height = dimensions.height + dimensions.y; 73 | } 74 | }); 75 | 76 | return styles; 77 | } 78 | 79 | export function calculateAlbumLayout( 80 | album: Image[], 81 | maxWidth: number, 82 | maxHeight: number 83 | ): IAlbumLayout { 84 | const spacing = 2; 85 | const ratios = album.map(i => i.width / i.height); 86 | const proportions = getProportions(ratios); 87 | const averageRatio = getAverageRatio(ratios); 88 | const albumCount = ratios.length; 89 | const forceCalc = ratios.some((ratio) => ratio > 2); 90 | let layout: IMediaLayout[]; 91 | 92 | const params = { 93 | ratios, 94 | proportions, 95 | averageRatio, 96 | maxWidth, 97 | minWidth: 100, 98 | maxHeight, 99 | spacing, 100 | }; 101 | 102 | if (albumCount === 1) { 103 | const ratio = ratios[0] 104 | layout = [{ 105 | dimensions: { 106 | x: 0, y: 0, 107 | width: maxWidth, 108 | height: ratio > 1 ? maxHeight / ratio : maxHeight 109 | }, 110 | sides: 4 111 | }] 112 | } else if (albumCount >= 5 || forceCalc) { 113 | layout = layoutWithComplexLayouter(params); 114 | } else if (albumCount === 2) { 115 | layout = layoutTwo(params); 116 | } else if (albumCount === 3) { 117 | layout = layoutThree(params); 118 | } else { 119 | layout = layoutFour(params); 120 | } 121 | 122 | return { 123 | layout, 124 | containerStyle: calculateContainerSize(layout), 125 | }; 126 | } 127 | 128 | function layoutWithComplexLayouter({ 129 | ratios: originalRatios, 130 | averageRatio, 131 | maxWidth, 132 | minWidth, 133 | spacing, 134 | maxHeight = (4 * maxWidth) / 3, 135 | }: ILayoutParams) { 136 | const ratios = cropRatios(originalRatios, averageRatio); 137 | const count = originalRatios.length; 138 | const result = new Array(count); 139 | const attempts: IAttempt[] = []; 140 | 141 | const multiHeight = (offset: number, attemptCount: number) => { 142 | const attemptRatios = ratios.slice(offset, offset + attemptCount); 143 | const sum = accumulate(attemptRatios, 0); 144 | 145 | return (maxWidth - (attemptCount - 1) * spacing) / sum; 146 | }; 147 | 148 | const pushAttempt = (lineCounts: number[]) => { 149 | const heights: number[] = []; 150 | let offset = 0; 151 | lineCounts.forEach((currentCount) => { 152 | heights.push(multiHeight(offset, currentCount)); 153 | offset += currentCount; 154 | }); 155 | 156 | attempts.push({ 157 | lineCounts, 158 | heights, 159 | }); 160 | }; 161 | 162 | for (let first = 1; first !== count; ++first) { 163 | const second = count - first; 164 | if (first <= 3 && second <= 3) { 165 | pushAttempt([first, second]); 166 | } 167 | } 168 | 169 | for (let first = 1; first !== count - 1; ++first) { 170 | for (let second = 1; second !== count - first; ++second) { 171 | const third = count - first - second; 172 | if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) { 173 | pushAttempt([first, second, third]); 174 | } 175 | } 176 | } 177 | 178 | for (let first = 1; first !== count - 1; ++first) { 179 | for (let second = 1; second !== count - first; ++second) { 180 | for (let third = 1; third !== count - first - second; ++third) { 181 | const fourth = count - first - second - third; 182 | if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) { 183 | pushAttempt([first, second, third, fourth]); 184 | } 185 | } 186 | } 187 | } 188 | 189 | let optimalAttempt: IAttempt | undefined; 190 | let optimalDiff = 0; 191 | for (let i = 0; i < attempts.length; i++) { 192 | const { 193 | heights, 194 | lineCounts, 195 | } = attempts[i]; 196 | const lineCount = lineCounts.length; 197 | const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1); 198 | const minLineHeight = Math.min(...heights); 199 | const bad1 = minLineHeight < minWidth ? 1.5 : 1; 200 | const bad2 = (() => { 201 | for (let line = 1; line !== lineCount; ++line) { 202 | if (lineCounts[line - 1] > lineCounts[line]) { 203 | return 1.5; 204 | } 205 | } 206 | 207 | return 1; 208 | })(); 209 | const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2; 210 | 211 | if (!optimalAttempt || diff < optimalDiff) { 212 | optimalAttempt = attempts[i]; 213 | optimalDiff = diff; 214 | } 215 | } 216 | 217 | const optimalCounts = optimalAttempt!.lineCounts; 218 | const optimalHeights = optimalAttempt!.heights; 219 | const rowCount = optimalCounts.length; 220 | let index = 0; 221 | let y = 0; 222 | for (let row = 0; row !== rowCount; ++row) { 223 | const colCount = optimalCounts[row]; 224 | const lineHeight = optimalHeights[row]; 225 | const height = Math.round(lineHeight); 226 | let x = 0; 227 | 228 | for (let col = 0; col !== colCount; ++col) { 229 | const sides = AlbumRectPart.None 230 | | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None) 231 | | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None) 232 | | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None) 233 | | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None); 234 | const ratio = ratios[index]; 235 | const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight); 236 | result[index] = { 237 | dimensions: { 238 | x, 239 | y, 240 | width, 241 | height, 242 | }, 243 | sides, 244 | }; 245 | x += width + spacing; 246 | ++index; 247 | } 248 | y += height + spacing; 249 | } 250 | 251 | return result; 252 | } 253 | 254 | function layoutTwo(params: ILayoutParams) { 255 | const { 256 | ratios, 257 | proportions, 258 | averageRatio, 259 | } = params; 260 | return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2 261 | ? layoutTwoTopBottom(params) 262 | : proportions === 'ww' || proportions === 'qq' 263 | ? layoutTwoLeftRightEqual(params) 264 | : layoutTwoLeftRight(params); 265 | } 266 | 267 | function layoutTwoTopBottom(params: ILayoutParams) { 268 | const { 269 | ratios, 270 | maxWidth, 271 | spacing, 272 | maxHeight, 273 | } = params; 274 | const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2))); 275 | 276 | return [{ 277 | dimensions: { 278 | x: 0, 279 | y: 0, 280 | width: maxWidth, 281 | height, 282 | }, 283 | sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, 284 | }, { 285 | dimensions: { 286 | x: 0, 287 | y: height + spacing, 288 | width: maxWidth, 289 | height, 290 | }, 291 | sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right, 292 | }]; 293 | } 294 | 295 | function layoutTwoLeftRightEqual(params: ILayoutParams) { 296 | const { 297 | ratios, 298 | maxWidth, 299 | spacing, 300 | maxHeight, 301 | } = params; 302 | const width = (maxWidth - spacing) / 2; 303 | const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight))); 304 | return [{ 305 | dimensions: { 306 | x: 0, 307 | y: 0, 308 | width, 309 | height, 310 | }, 311 | sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, 312 | }, { 313 | dimensions: { 314 | x: width + spacing, 315 | y: 0, 316 | width, 317 | height, 318 | }, 319 | sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom, 320 | }]; 321 | } 322 | 323 | function layoutTwoLeftRight(params: ILayoutParams) { 324 | const { 325 | ratios, 326 | minWidth, 327 | maxWidth, 328 | spacing, 329 | maxHeight, 330 | } = params; 331 | const minimalWidth = Math.round(1.5 * minWidth); 332 | const secondWidth = Math.min( 333 | Math.round( 334 | Math.max( 335 | 0.4 * (maxWidth - spacing), 336 | (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]), 337 | ), 338 | ), 339 | maxWidth - spacing - minimalWidth, 340 | ); 341 | const firstWidth = maxWidth - secondWidth - spacing; 342 | const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1]))); 343 | 344 | return [{ 345 | dimensions: { 346 | x: 0, 347 | y: 0, 348 | width: firstWidth, 349 | height, 350 | }, 351 | sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, 352 | }, { 353 | dimensions: { 354 | x: firstWidth + spacing, 355 | y: 0, 356 | width: secondWidth, 357 | height, 358 | }, 359 | sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom, 360 | }]; 361 | } 362 | 363 | function layoutThree(params: ILayoutParams) { 364 | const { proportions } = params; 365 | 366 | return proportions[0] === 'n' 367 | ? layoutThreeLeftAndOther(params) 368 | : layoutThreeTopAndOther(params); 369 | } 370 | 371 | function layoutThreeLeftAndOther(params: ILayoutParams) { 372 | const { 373 | maxHeight, 374 | spacing, 375 | ratios, 376 | maxWidth, 377 | minWidth, 378 | } = params; 379 | const firstHeight = maxHeight; 380 | const thirdHeight = Math.round( 381 | Math.min( 382 | (maxHeight - spacing) / 2, 383 | (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]), 384 | ), 385 | ); 386 | const secondHeight = firstHeight - thirdHeight - spacing; 387 | const rightWidth = Math.max( 388 | minWidth, 389 | Math.round( 390 | Math.min( 391 | (maxWidth - spacing) / 2, 392 | Math.min( 393 | thirdHeight * ratios[2], 394 | secondHeight * ratios[1], 395 | ), 396 | ), 397 | ), 398 | ); 399 | const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth); 400 | 401 | return [{ 402 | dimensions: { 403 | x: 0, 404 | y: 0, 405 | width: leftWidth, 406 | height: firstHeight, 407 | }, 408 | sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, 409 | }, { 410 | dimensions: { 411 | x: leftWidth + spacing, 412 | y: 0, 413 | width: rightWidth, 414 | height: secondHeight, 415 | }, 416 | sides: AlbumRectPart.Top | AlbumRectPart.Right, 417 | }, { 418 | dimensions: { 419 | x: leftWidth + spacing, 420 | y: secondHeight + spacing, 421 | width: rightWidth, 422 | height: thirdHeight, 423 | }, 424 | sides: AlbumRectPart.Bottom | AlbumRectPart.Right, 425 | }]; 426 | } 427 | 428 | function layoutThreeTopAndOther(params: ILayoutParams) { 429 | const { 430 | maxWidth, 431 | ratios, 432 | maxHeight, 433 | spacing, 434 | } = params; 435 | const firstWidth = maxWidth; 436 | const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing))); 437 | const secondWidth = (maxWidth - spacing) / 2; 438 | const secondHeight = Math.min( 439 | maxHeight - firstHeight - spacing, 440 | Math.round(Math.min( 441 | secondWidth / ratios[1], 442 | secondWidth / ratios[2], 443 | )), 444 | ); 445 | const thirdWidth = firstWidth - secondWidth - spacing; 446 | 447 | return [{ 448 | dimensions: { 449 | x: 0, 450 | y: 0, 451 | width: firstWidth, 452 | height: firstHeight, 453 | }, 454 | sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, 455 | }, { 456 | dimensions: { 457 | x: 0, 458 | y: firstHeight + spacing, 459 | width: secondWidth, 460 | height: secondHeight, 461 | }, 462 | sides: AlbumRectPart.Bottom | AlbumRectPart.Left, 463 | }, { 464 | dimensions: { 465 | x: secondWidth + spacing, 466 | y: firstHeight + spacing, 467 | width: thirdWidth, 468 | height: secondHeight, 469 | }, 470 | sides: AlbumRectPart.Bottom | AlbumRectPart.Right, 471 | }]; 472 | } 473 | 474 | function layoutFour(params: ILayoutParams) { 475 | const { proportions } = params; 476 | 477 | return proportions[0] === 'w' 478 | ? layoutFourTopAndOther(params) 479 | : layoutFourLeftAndOther(params); 480 | } 481 | 482 | function layoutFourTopAndOther({ 483 | maxWidth, 484 | ratios, 485 | spacing, 486 | maxHeight, 487 | minWidth, 488 | }: ILayoutParams) { 489 | const w = maxWidth; 490 | const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing))); 491 | const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3])); 492 | const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1]))); 493 | const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3])); 494 | const w1 = w - w0 - w2 - 2 * spacing; 495 | const h1 = Math.min(maxHeight - h0 - spacing, h); 496 | 497 | return [{ 498 | dimensions: { 499 | x: 0, 500 | y: 0, 501 | width: w, 502 | height: h0, 503 | }, 504 | sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, 505 | }, { 506 | dimensions: { 507 | x: 0, 508 | y: h0 + spacing, 509 | width: w0, 510 | height: h1, 511 | }, 512 | sides: AlbumRectPart.Bottom | AlbumRectPart.Left, 513 | }, { 514 | dimensions: { 515 | x: w0 + spacing, 516 | y: h0 + spacing, 517 | width: w1, 518 | height: h1, 519 | }, 520 | sides: AlbumRectPart.Bottom, 521 | }, { 522 | dimensions: { 523 | x: w0 + spacing + w1 + spacing, 524 | y: h0 + spacing, 525 | width: w2, 526 | height: h1, 527 | }, 528 | sides: AlbumRectPart.Right | AlbumRectPart.Bottom, 529 | }]; 530 | } 531 | 532 | function layoutFourLeftAndOther({ 533 | maxHeight, 534 | ratios, 535 | maxWidth, 536 | spacing, 537 | minWidth, 538 | }: ILayoutParams) { 539 | const h = maxHeight; 540 | const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing))); 541 | const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3])); 542 | const h0 = Math.round(w / ratios[1]); 543 | const h1 = Math.round(w / ratios[2]); 544 | const h2 = h - h0 - h1 - 2 * spacing; 545 | const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w)); 546 | 547 | return [{ 548 | dimensions: { 549 | x: 0, 550 | y: 0, 551 | width: w0, 552 | height: h, 553 | }, 554 | sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, 555 | }, { 556 | dimensions: { 557 | x: w0 + spacing, 558 | y: 0, 559 | width: w1, 560 | height: h0, 561 | }, 562 | sides: AlbumRectPart.Top | AlbumRectPart.Right, 563 | }, { 564 | dimensions: { 565 | x: w0 + spacing, 566 | y: h0 + spacing, 567 | width: w1, 568 | height: h1, 569 | }, 570 | sides: AlbumRectPart.Right, 571 | }, { 572 | dimensions: { 573 | x: w0 + spacing, 574 | y: h0 + h1 + 2 * spacing, 575 | width: w1, 576 | height: h2, 577 | }, 578 | sides: AlbumRectPart.Bottom | AlbumRectPart.Right, 579 | }]; 580 | } 581 | -------------------------------------------------------------------------------- /src/logic/webz/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@antfu/install-pkg@^0.1.1": 6 | version "0.1.1" 7 | resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" 8 | integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== 9 | dependencies: 10 | execa "^5.1.1" 11 | find-up "^5.0.0" 12 | 13 | "@antfu/utils@^0.7.2", "@antfu/utils@^0.7.4": 14 | version "0.7.4" 15 | resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.4.tgz#b1c11b95f89f13842204d3d83de01e10bb9257db" 16 | integrity sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ== 17 | 18 | "@babel/parser@^7.20.15", "@babel/parser@^7.21.3": 19 | version "7.22.5" 20 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" 21 | integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== 22 | 23 | "@ctrl/tinycolor@^3.4.1": 24 | version "3.6.0" 25 | resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" 26 | integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== 27 | 28 | "@element-plus/icons-vue@^2.0.6": 29 | version "2.1.0" 30 | resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz#7ad90d08a8c0d5fd3af31c4f73264ca89614397a" 31 | integrity sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA== 32 | 33 | "@esbuild/android-arm64@0.17.19": 34 | version "0.17.19" 35 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" 36 | integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== 37 | 38 | "@esbuild/android-arm@0.17.19": 39 | version "0.17.19" 40 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" 41 | integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== 42 | 43 | "@esbuild/android-x64@0.17.19": 44 | version "0.17.19" 45 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" 46 | integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== 47 | 48 | "@esbuild/darwin-arm64@0.17.19": 49 | version "0.17.19" 50 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" 51 | integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== 52 | 53 | "@esbuild/darwin-x64@0.17.19": 54 | version "0.17.19" 55 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" 56 | integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== 57 | 58 | "@esbuild/freebsd-arm64@0.17.19": 59 | version "0.17.19" 60 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" 61 | integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== 62 | 63 | "@esbuild/freebsd-x64@0.17.19": 64 | version "0.17.19" 65 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" 66 | integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== 67 | 68 | "@esbuild/linux-arm64@0.17.19": 69 | version "0.17.19" 70 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" 71 | integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== 72 | 73 | "@esbuild/linux-arm@0.17.19": 74 | version "0.17.19" 75 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" 76 | integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== 77 | 78 | "@esbuild/linux-ia32@0.17.19": 79 | version "0.17.19" 80 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" 81 | integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== 82 | 83 | "@esbuild/linux-loong64@0.17.19": 84 | version "0.17.19" 85 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" 86 | integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== 87 | 88 | "@esbuild/linux-mips64el@0.17.19": 89 | version "0.17.19" 90 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" 91 | integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== 92 | 93 | "@esbuild/linux-ppc64@0.17.19": 94 | version "0.17.19" 95 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" 96 | integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== 97 | 98 | "@esbuild/linux-riscv64@0.17.19": 99 | version "0.17.19" 100 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" 101 | integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== 102 | 103 | "@esbuild/linux-s390x@0.17.19": 104 | version "0.17.19" 105 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" 106 | integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== 107 | 108 | "@esbuild/linux-x64@0.17.19": 109 | version "0.17.19" 110 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" 111 | integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== 112 | 113 | "@esbuild/netbsd-x64@0.17.19": 114 | version "0.17.19" 115 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" 116 | integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== 117 | 118 | "@esbuild/openbsd-x64@0.17.19": 119 | version "0.17.19" 120 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" 121 | integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== 122 | 123 | "@esbuild/sunos-x64@0.17.19": 124 | version "0.17.19" 125 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" 126 | integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== 127 | 128 | "@esbuild/win32-arm64@0.17.19": 129 | version "0.17.19" 130 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" 131 | integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== 132 | 133 | "@esbuild/win32-ia32@0.17.19": 134 | version "0.17.19" 135 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" 136 | integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== 137 | 138 | "@esbuild/win32-x64@0.17.19": 139 | version "0.17.19" 140 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" 141 | integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== 142 | 143 | "@floating-ui/core@^1.3.1": 144 | version "1.3.1" 145 | resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.1.tgz#4d795b649cc3b1cbb760d191c80dcb4353c9a366" 146 | integrity sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g== 147 | 148 | "@floating-ui/dom@^1.0.1": 149 | version "1.4.3" 150 | resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.3.tgz#0854a3297ea03894932381f3ea1403fab3a6e602" 151 | integrity sha512-nB/68NyaQlcdY22L+Fgd1HERQ7UGv7XFN+tPxwrEfQL4nKtAP/jIZnZtpUlXbtV+VEGHh6W/63Gy2C5biWI3sA== 152 | dependencies: 153 | "@floating-ui/core" "^1.3.1" 154 | 155 | "@iconify/json@^2.1.154": 156 | version "2.2.84" 157 | resolved "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.84.tgz#c54df1d05437bf958cbaea9a83901e2b27cf078c" 158 | integrity sha512-glkGJVOP9ch5NVEAyh0/ov8/qYFuEtaVNfKRQubKBEeOySG/soYFYa/+0+ZZPNLQJtVvkPYWgvX1GZYEbraliw== 159 | dependencies: 160 | "@iconify/types" "*" 161 | pathe "^1.1.0" 162 | 163 | "@iconify/types@*", "@iconify/types@^2.0.0": 164 | version "2.0.0" 165 | resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" 166 | integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== 167 | 168 | "@iconify/utils@^2.1.6": 169 | version "2.1.7" 170 | resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.7.tgz#f6be175e08194925bf2cb091a8a3e36c88b8b636" 171 | integrity sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw== 172 | dependencies: 173 | "@antfu/install-pkg" "^0.1.1" 174 | "@antfu/utils" "^0.7.4" 175 | "@iconify/types" "^2.0.0" 176 | debug "^4.3.4" 177 | kolorist "^1.8.0" 178 | local-pkg "^0.4.3" 179 | 180 | "@isaacs/cliui@^8.0.2": 181 | version "8.0.2" 182 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 183 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 184 | dependencies: 185 | string-width "^5.1.2" 186 | string-width-cjs "npm:string-width@^4.2.0" 187 | strip-ansi "^7.0.1" 188 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 189 | wrap-ansi "^8.1.0" 190 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 191 | 192 | "@jridgewell/sourcemap-codec@^1.4.13": 193 | version "1.4.15" 194 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 195 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 196 | 197 | "@nodelib/fs.scandir@2.1.5": 198 | version "2.1.5" 199 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 200 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 201 | dependencies: 202 | "@nodelib/fs.stat" "2.0.5" 203 | run-parallel "^1.1.9" 204 | 205 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 206 | version "2.0.5" 207 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 208 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 209 | 210 | "@nodelib/fs.walk@^1.2.3": 211 | version "1.2.8" 212 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 213 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 214 | dependencies: 215 | "@nodelib/fs.scandir" "2.1.5" 216 | fastq "^1.6.0" 217 | 218 | "@pkgjs/parseargs@^0.11.0": 219 | version "0.11.0" 220 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 221 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 222 | 223 | "@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": 224 | version "2.11.7" 225 | resolved "https://registry.yarnpkg.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671" 226 | integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== 227 | 228 | "@rollup/pluginutils@^5.0.2": 229 | version "5.0.2" 230 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" 231 | integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== 232 | dependencies: 233 | "@types/estree" "^1.0.0" 234 | estree-walker "^2.0.2" 235 | picomatch "^2.3.1" 236 | 237 | "@types/estree@^1.0.0": 238 | version "1.0.1" 239 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" 240 | integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== 241 | 242 | "@types/lodash-es@^4.17.6": 243 | version "4.17.7" 244 | resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.7.tgz#22edcae9f44aff08546e71db8925f05b33c7cc40" 245 | integrity sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ== 246 | dependencies: 247 | "@types/lodash" "*" 248 | 249 | "@types/lodash@*", "@types/lodash@^4.14.182": 250 | version "4.14.195" 251 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" 252 | integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== 253 | 254 | "@types/marked@^4.0.7": 255 | version "4.3.1" 256 | resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.3.1.tgz#45fb6dfd47afb595766c71ed7749ead23f137de3" 257 | integrity sha512-vSSbKZFbNktrQ15v7o1EaH78EbWV+sPQbPjHG+Cp8CaNcPFUEfjZ0Iml/V0bFDwsTlYe8o6XC5Hfdp91cqPV2g== 258 | 259 | "@types/node@^18.11.10": 260 | version "18.16.18" 261 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" 262 | integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== 263 | 264 | "@types/web-bluetooth@^0.0.16": 265 | version "0.0.16" 266 | resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" 267 | integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== 268 | 269 | "@vitejs/plugin-vue@^4.0.0": 270 | version "4.2.3" 271 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6" 272 | integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw== 273 | 274 | "@volar/language-core@1.7.10": 275 | version "1.7.10" 276 | resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.7.10.tgz#605edda2844c51bd31fff75d9311023d2c574ec0" 277 | integrity sha512-18Gmth5M0UI3hDDqhZngjMnb6WCslcfglkOdepRIhGxRYe7xR7DRRzciisYDMZsvOQxDYme+uaohg0dKUxLV2Q== 278 | dependencies: 279 | "@volar/source-map" "1.7.10" 280 | 281 | "@volar/source-map@1.7.10": 282 | version "1.7.10" 283 | resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.7.10.tgz#756be885bfeb6249c4fa2526c40c0eee4086aeed" 284 | integrity sha512-FBpLEOKJpRxeh2nYbw1mTI5sZOPXYU8LlsCz6xuBY3yNtAizDTTIZtBHe1V8BaMpoSMgRysZe4gVxMEi3rDGVA== 285 | dependencies: 286 | muggle-string "^0.3.1" 287 | 288 | "@volar/typescript@1.7.10": 289 | version "1.7.10" 290 | resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.7.10.tgz#d1b11e8cbc5ed0da69f9b8cd3d04cbbc4f06227e" 291 | integrity sha512-yqIov4wndLU3GE1iE25bU5W6T+P+exPePcE1dFPPBKzQIBki1KvmdQN5jBlJp3Wo+wp7UIxa/RsdNkXT+iFBjg== 292 | dependencies: 293 | "@volar/language-core" "1.7.10" 294 | 295 | "@vue-leaflet/vue-leaflet@0.8.4": 296 | version "0.8.4" 297 | resolved "https://registry.yarnpkg.com/@vue-leaflet/vue-leaflet/-/vue-leaflet-0.8.4.tgz#8a26606fd1c28e1ca8717aebd4c5c147057c6b29" 298 | integrity sha512-FyD75jMKzBQCW4TrzRMrIBa8OwaUXaSeaDWJvp7FIjpZzk8niHBfpP+QirA/BT9536FJXviRkmwac3Z7YOQHKQ== 299 | 300 | "@vue/compiler-core@3.3.4": 301 | version "3.3.4" 302 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" 303 | integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== 304 | dependencies: 305 | "@babel/parser" "^7.21.3" 306 | "@vue/shared" "3.3.4" 307 | estree-walker "^2.0.2" 308 | source-map-js "^1.0.2" 309 | 310 | "@vue/compiler-dom@3.3.4", "@vue/compiler-dom@^3.3.0": 311 | version "3.3.4" 312 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" 313 | integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== 314 | dependencies: 315 | "@vue/compiler-core" "3.3.4" 316 | "@vue/shared" "3.3.4" 317 | 318 | "@vue/compiler-sfc@3.3.4": 319 | version "3.3.4" 320 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" 321 | integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== 322 | dependencies: 323 | "@babel/parser" "^7.20.15" 324 | "@vue/compiler-core" "3.3.4" 325 | "@vue/compiler-dom" "3.3.4" 326 | "@vue/compiler-ssr" "3.3.4" 327 | "@vue/reactivity-transform" "3.3.4" 328 | "@vue/shared" "3.3.4" 329 | estree-walker "^2.0.2" 330 | magic-string "^0.30.0" 331 | postcss "^8.1.10" 332 | source-map-js "^1.0.2" 333 | 334 | "@vue/compiler-ssr@3.3.4": 335 | version "3.3.4" 336 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" 337 | integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== 338 | dependencies: 339 | "@vue/compiler-dom" "3.3.4" 340 | "@vue/shared" "3.3.4" 341 | 342 | "@vue/language-core@1.8.3": 343 | version "1.8.3" 344 | resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.3.tgz#5d0d24b0290343c592c1e30712553804856b366a" 345 | integrity sha512-AzhvMYoQkK/tg8CpAAttO19kx1zjS3+weYIr2AhlH/M5HebVzfftQoq4jZNFifjq+hyLKi8j9FiDMS8oqA89+A== 346 | dependencies: 347 | "@volar/language-core" "1.7.10" 348 | "@volar/source-map" "1.7.10" 349 | "@vue/compiler-dom" "^3.3.0" 350 | "@vue/reactivity" "^3.3.0" 351 | "@vue/shared" "^3.3.0" 352 | minimatch "^9.0.0" 353 | muggle-string "^0.3.1" 354 | vue-template-compiler "^2.7.14" 355 | 356 | "@vue/reactivity-transform@3.3.4": 357 | version "3.3.4" 358 | resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" 359 | integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== 360 | dependencies: 361 | "@babel/parser" "^7.20.15" 362 | "@vue/compiler-core" "3.3.4" 363 | "@vue/shared" "3.3.4" 364 | estree-walker "^2.0.2" 365 | magic-string "^0.30.0" 366 | 367 | "@vue/reactivity@3.3.4", "@vue/reactivity@^3.3.0": 368 | version "3.3.4" 369 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" 370 | integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== 371 | dependencies: 372 | "@vue/shared" "3.3.4" 373 | 374 | "@vue/runtime-core@3.3.4": 375 | version "3.3.4" 376 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" 377 | integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== 378 | dependencies: 379 | "@vue/reactivity" "3.3.4" 380 | "@vue/shared" "3.3.4" 381 | 382 | "@vue/runtime-dom@3.3.4": 383 | version "3.3.4" 384 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" 385 | integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== 386 | dependencies: 387 | "@vue/runtime-core" "3.3.4" 388 | "@vue/shared" "3.3.4" 389 | csstype "^3.1.1" 390 | 391 | "@vue/server-renderer@3.3.4": 392 | version "3.3.4" 393 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" 394 | integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== 395 | dependencies: 396 | "@vue/compiler-ssr" "3.3.4" 397 | "@vue/shared" "3.3.4" 398 | 399 | "@vue/shared@3.3.4", "@vue/shared@^3.3.0": 400 | version "3.3.4" 401 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" 402 | integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== 403 | 404 | "@vue/typescript@1.8.3": 405 | version "1.8.3" 406 | resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.3.tgz#fde59493ca9a16c61880ba6d570ae6b092697a40" 407 | integrity sha512-6bdgSnIFpRYHlt70pHmnmNksPU00bfXgqAISeaNz3W6d2cH0OTfH8h/IhligQ82sJIhsuyfftQJ5518ZuKIhtA== 408 | dependencies: 409 | "@volar/typescript" "1.7.10" 410 | "@vue/language-core" "1.8.3" 411 | 412 | "@vueuse/core@^9.1.0": 413 | version "9.13.0" 414 | resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" 415 | integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== 416 | dependencies: 417 | "@types/web-bluetooth" "^0.0.16" 418 | "@vueuse/metadata" "9.13.0" 419 | "@vueuse/shared" "9.13.0" 420 | vue-demi "*" 421 | 422 | "@vueuse/metadata@9.13.0": 423 | version "9.13.0" 424 | resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" 425 | integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== 426 | 427 | "@vueuse/shared@9.13.0": 428 | version "9.13.0" 429 | resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" 430 | integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== 431 | dependencies: 432 | vue-demi "*" 433 | 434 | acorn@^8.8.2, acorn@^8.9.0: 435 | version "8.9.0" 436 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" 437 | integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== 438 | 439 | ansi-regex@^5.0.1: 440 | version "5.0.1" 441 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 442 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 443 | 444 | ansi-regex@^6.0.1: 445 | version "6.0.1" 446 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 447 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 448 | 449 | ansi-styles@^4.0.0: 450 | version "4.3.0" 451 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 452 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 453 | dependencies: 454 | color-convert "^2.0.1" 455 | 456 | ansi-styles@^6.1.0: 457 | version "6.2.1" 458 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 459 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 460 | 461 | anymatch@~3.1.2: 462 | version "3.1.3" 463 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 464 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 465 | dependencies: 466 | normalize-path "^3.0.0" 467 | picomatch "^2.0.4" 468 | 469 | async-validator@^4.2.5: 470 | version "4.2.5" 471 | resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" 472 | integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== 473 | 474 | balanced-match@^1.0.0: 475 | version "1.0.2" 476 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 477 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 478 | 479 | binary-extensions@^2.0.0: 480 | version "2.2.0" 481 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 482 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 483 | 484 | brace-expansion@^2.0.1: 485 | version "2.0.1" 486 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 487 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 488 | dependencies: 489 | balanced-match "^1.0.0" 490 | 491 | braces@^3.0.2, braces@~3.0.2: 492 | version "3.0.2" 493 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 494 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 495 | dependencies: 496 | fill-range "^7.0.1" 497 | 498 | "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: 499 | version "3.5.3" 500 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 501 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 502 | dependencies: 503 | anymatch "~3.1.2" 504 | braces "~3.0.2" 505 | glob-parent "~5.1.2" 506 | is-binary-path "~2.1.0" 507 | is-glob "~4.0.1" 508 | normalize-path "~3.0.0" 509 | readdirp "~3.6.0" 510 | optionalDependencies: 511 | fsevents "~2.3.2" 512 | 513 | color-convert@^2.0.1: 514 | version "2.0.1" 515 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 516 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 517 | dependencies: 518 | color-name "~1.1.4" 519 | 520 | color-name@~1.1.4: 521 | version "1.1.4" 522 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 523 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 524 | 525 | core-js@^3.26.1: 526 | version "3.31.0" 527 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.31.0.tgz#4471dd33e366c79d8c0977ed2d940821719db344" 528 | integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== 529 | 530 | create-html-element@^4.0.1: 531 | version "4.0.1" 532 | resolved "https://registry.yarnpkg.com/create-html-element/-/create-html-element-4.0.1.tgz#037197116084de7822c7259f426ab53f38efa1a9" 533 | integrity sha512-K/wr7TGTPh4v2m5JpxNWQ/W4/lHkVjun7rTmg8ycNjbJE0ngjxvVYSiYzgq4iiJ+H5zq2FcPu6ZehCZHHcZtfA== 534 | dependencies: 535 | escape-goat "^4.0.0" 536 | html-tags "^3.1.0" 537 | stringify-attributes "^3.0.0" 538 | type-fest "^2.5.0" 539 | 540 | cross-spawn@^7.0.0, cross-spawn@^7.0.3: 541 | version "7.0.3" 542 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 543 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 544 | dependencies: 545 | path-key "^3.1.0" 546 | shebang-command "^2.0.0" 547 | which "^2.0.1" 548 | 549 | csstype@^3.1.1: 550 | version "3.1.2" 551 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" 552 | integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 553 | 554 | custom-event-polyfill@^1.0.7: 555 | version "1.0.7" 556 | resolved "https://registry.yarnpkg.com/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz#9bc993ddda937c1a30ccd335614c6c58c4f87aee" 557 | integrity sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w== 558 | 559 | dayjs@^1.11.3: 560 | version "1.11.8" 561 | resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" 562 | integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== 563 | 564 | de-indent@^1.0.2: 565 | version "1.0.2" 566 | resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 567 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 568 | 569 | debug@^4.3.4: 570 | version "4.3.4" 571 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 572 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 573 | dependencies: 574 | ms "2.1.2" 575 | 576 | deepmerge@^4.2.2: 577 | version "4.3.1" 578 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" 579 | integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== 580 | 581 | dom-serializer@^2.0.0: 582 | version "2.0.0" 583 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" 584 | integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== 585 | dependencies: 586 | domelementtype "^2.3.0" 587 | domhandler "^5.0.2" 588 | entities "^4.2.0" 589 | 590 | domelementtype@^2.3.0: 591 | version "2.3.0" 592 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" 593 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 594 | 595 | domhandler@^5.0.2, domhandler@^5.0.3: 596 | version "5.0.3" 597 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" 598 | integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== 599 | dependencies: 600 | domelementtype "^2.3.0" 601 | 602 | domutils@^3.0.1: 603 | version "3.1.0" 604 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" 605 | integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== 606 | dependencies: 607 | dom-serializer "^2.0.0" 608 | domelementtype "^2.3.0" 609 | domhandler "^5.0.3" 610 | 611 | eastasianwidth@^0.2.0: 612 | version "0.2.0" 613 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 614 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 615 | 616 | element-plus@^2.2.26: 617 | version "2.3.7" 618 | resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.3.7.tgz#544a127f0e65f51715e3b24ec3ebf545c46859cd" 619 | integrity sha512-h6TxclbaLUJxg/Bv5j/ZKsK+K5yadQliw5+R30HWyE69pXlqXTX24oYx+yw3pA4Dy+lqEDi5501FQ0CORk3OSA== 620 | dependencies: 621 | "@ctrl/tinycolor" "^3.4.1" 622 | "@element-plus/icons-vue" "^2.0.6" 623 | "@floating-ui/dom" "^1.0.1" 624 | "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" 625 | "@types/lodash" "^4.14.182" 626 | "@types/lodash-es" "^4.17.6" 627 | "@vueuse/core" "^9.1.0" 628 | async-validator "^4.2.5" 629 | dayjs "^1.11.3" 630 | escape-html "^1.0.3" 631 | lodash "^4.17.21" 632 | lodash-es "^4.17.21" 633 | lodash-unified "^1.0.2" 634 | memoize-one "^6.0.0" 635 | normalize-wheel-es "^1.2.0" 636 | 637 | emoji-regex@^8.0.0: 638 | version "8.0.0" 639 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 640 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 641 | 642 | emoji-regex@^9.2.2: 643 | version "9.2.2" 644 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 645 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 646 | 647 | entities@^4.2.0, entities@^4.4.0: 648 | version "4.5.0" 649 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 650 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 651 | 652 | esbuild@^0.17.5: 653 | version "0.17.19" 654 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" 655 | integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== 656 | optionalDependencies: 657 | "@esbuild/android-arm" "0.17.19" 658 | "@esbuild/android-arm64" "0.17.19" 659 | "@esbuild/android-x64" "0.17.19" 660 | "@esbuild/darwin-arm64" "0.17.19" 661 | "@esbuild/darwin-x64" "0.17.19" 662 | "@esbuild/freebsd-arm64" "0.17.19" 663 | "@esbuild/freebsd-x64" "0.17.19" 664 | "@esbuild/linux-arm" "0.17.19" 665 | "@esbuild/linux-arm64" "0.17.19" 666 | "@esbuild/linux-ia32" "0.17.19" 667 | "@esbuild/linux-loong64" "0.17.19" 668 | "@esbuild/linux-mips64el" "0.17.19" 669 | "@esbuild/linux-ppc64" "0.17.19" 670 | "@esbuild/linux-riscv64" "0.17.19" 671 | "@esbuild/linux-s390x" "0.17.19" 672 | "@esbuild/linux-x64" "0.17.19" 673 | "@esbuild/netbsd-x64" "0.17.19" 674 | "@esbuild/openbsd-x64" "0.17.19" 675 | "@esbuild/sunos-x64" "0.17.19" 676 | "@esbuild/win32-arm64" "0.17.19" 677 | "@esbuild/win32-ia32" "0.17.19" 678 | "@esbuild/win32-x64" "0.17.19" 679 | 680 | escape-goat@^3.0.0: 681 | version "3.0.0" 682 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" 683 | integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== 684 | 685 | escape-goat@^4.0.0: 686 | version "4.0.0" 687 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" 688 | integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== 689 | 690 | escape-html@^1.0.3: 691 | version "1.0.3" 692 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 693 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 694 | 695 | escape-string-regexp@^4.0.0: 696 | version "4.0.0" 697 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 698 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 699 | 700 | escape-string-regexp@^5.0.0: 701 | version "5.0.0" 702 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" 703 | integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== 704 | 705 | estree-walker@^2.0.2: 706 | version "2.0.2" 707 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 708 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 709 | 710 | execa@^5.1.1: 711 | version "5.1.1" 712 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 713 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 714 | dependencies: 715 | cross-spawn "^7.0.3" 716 | get-stream "^6.0.0" 717 | human-signals "^2.1.0" 718 | is-stream "^2.0.0" 719 | merge-stream "^2.0.0" 720 | npm-run-path "^4.0.1" 721 | onetime "^5.1.2" 722 | signal-exit "^3.0.3" 723 | strip-final-newline "^2.0.0" 724 | 725 | fast-glob@^3.2.12: 726 | version "3.2.12" 727 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 728 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 729 | dependencies: 730 | "@nodelib/fs.stat" "^2.0.2" 731 | "@nodelib/fs.walk" "^1.2.3" 732 | glob-parent "^5.1.2" 733 | merge2 "^1.3.0" 734 | micromatch "^4.0.4" 735 | 736 | fastq@^1.6.0: 737 | version "1.15.0" 738 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 739 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 740 | dependencies: 741 | reusify "^1.0.4" 742 | 743 | fill-range@^7.0.1: 744 | version "7.0.1" 745 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 746 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 747 | dependencies: 748 | to-regex-range "^5.0.1" 749 | 750 | find-up@^5.0.0: 751 | version "5.0.0" 752 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 753 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 754 | dependencies: 755 | locate-path "^6.0.0" 756 | path-exists "^4.0.0" 757 | 758 | foreground-child@^3.1.0: 759 | version "3.1.1" 760 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" 761 | integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== 762 | dependencies: 763 | cross-spawn "^7.0.0" 764 | signal-exit "^4.0.1" 765 | 766 | fsevents@~2.3.2: 767 | version "2.3.2" 768 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 769 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 770 | 771 | function-bind@^1.1.1: 772 | version "1.1.1" 773 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 774 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 775 | 776 | get-stream@^6.0.0: 777 | version "6.0.1" 778 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 779 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 780 | 781 | glob-parent@^5.1.2, glob-parent@~5.1.2: 782 | version "5.1.2" 783 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 784 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 785 | dependencies: 786 | is-glob "^4.0.1" 787 | 788 | glob@^10.2.5: 789 | version "10.3.1" 790 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.1.tgz#9789cb1b994515bedb811a6deca735b5c37d2bf4" 791 | integrity sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw== 792 | dependencies: 793 | foreground-child "^3.1.0" 794 | jackspeak "^2.0.3" 795 | minimatch "^9.0.1" 796 | minipass "^5.0.0 || ^6.0.2" 797 | path-scurry "^1.10.0" 798 | 799 | has@^1.0.3: 800 | version "1.0.3" 801 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 802 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 803 | dependencies: 804 | function-bind "^1.1.1" 805 | 806 | he@^1.2.0: 807 | version "1.2.0" 808 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 809 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 810 | 811 | html-tags@^3.1.0: 812 | version "3.3.1" 813 | resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" 814 | integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== 815 | 816 | htmlparser2@^8.0.0: 817 | version "8.0.2" 818 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" 819 | integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== 820 | dependencies: 821 | domelementtype "^2.3.0" 822 | domhandler "^5.0.3" 823 | domutils "^3.0.1" 824 | entities "^4.4.0" 825 | 826 | human-signals@^2.1.0: 827 | version "2.1.0" 828 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 829 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 830 | 831 | immutable@^4.0.0: 832 | version "4.3.0" 833 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" 834 | integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== 835 | 836 | is-binary-path@~2.1.0: 837 | version "2.1.0" 838 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 839 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 840 | dependencies: 841 | binary-extensions "^2.0.0" 842 | 843 | is-core-module@^2.11.0: 844 | version "2.12.1" 845 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" 846 | integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== 847 | dependencies: 848 | has "^1.0.3" 849 | 850 | is-extglob@^2.1.1: 851 | version "2.1.1" 852 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 853 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 854 | 855 | is-fullwidth-code-point@^3.0.0: 856 | version "3.0.0" 857 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 858 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 859 | 860 | is-glob@^4.0.1, is-glob@~4.0.1: 861 | version "4.0.3" 862 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 863 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 864 | dependencies: 865 | is-extglob "^2.1.1" 866 | 867 | is-number@^7.0.0: 868 | version "7.0.0" 869 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 870 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 871 | 872 | is-plain-object@^5.0.0: 873 | version "5.0.0" 874 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" 875 | integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== 876 | 877 | is-stream@^2.0.0: 878 | version "2.0.1" 879 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 880 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 881 | 882 | isexe@^2.0.0: 883 | version "2.0.0" 884 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 885 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 886 | 887 | jackspeak@^2.0.3: 888 | version "2.2.1" 889 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" 890 | integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== 891 | dependencies: 892 | "@isaacs/cliui" "^8.0.2" 893 | optionalDependencies: 894 | "@pkgjs/parseargs" "^0.11.0" 895 | 896 | js-file-download@^0.4.12: 897 | version "0.4.12" 898 | resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821" 899 | integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg== 900 | 901 | jsonc-parser@^3.2.0: 902 | version "3.2.0" 903 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" 904 | integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== 905 | 906 | keycode-js@^3.1.0: 907 | version "3.1.0" 908 | resolved "https://registry.yarnpkg.com/keycode-js/-/keycode-js-3.1.0.tgz#9938d5488f9415ae243c4de6d6e827af293c7d75" 909 | integrity sha512-aAa8PVW7kBDyG14ifGOseaVBjsT1LI953060yRSzzf3G0beKKEuwHVvFGcCI+AofY68NUkPxbLqrkfWPjXySCw== 910 | 911 | kolorist@^1.8.0: 912 | version "1.8.0" 913 | resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" 914 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== 915 | 916 | leaflet@^1.9.3: 917 | version "1.9.4" 918 | resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.9.4.tgz#23fae724e282fa25745aff82ca4d394748db7d8d" 919 | integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== 920 | 921 | linkify-urls@^4.0.0: 922 | version "4.0.0" 923 | resolved "https://registry.yarnpkg.com/linkify-urls/-/linkify-urls-4.0.0.tgz#44bb1375a3d287eea11c4e7c6a5a5756c9ecb29e" 924 | integrity sha512-Kjj+9gZtj+Yf93LL1UPND6F/F5hcZAINuBfS4AKiOUh5mmfVjSiZWBg75ebCJ8onkf0lIMJhiOQXF3BCBBmCtw== 925 | dependencies: 926 | create-html-element "^4.0.1" 927 | 928 | loadjs@^4.2.0: 929 | version "4.2.0" 930 | resolved "https://registry.yarnpkg.com/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6" 931 | integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== 932 | 933 | local-pkg@^0.4.3: 934 | version "0.4.3" 935 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" 936 | integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== 937 | 938 | locate-path@^6.0.0: 939 | version "6.0.0" 940 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 941 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 942 | dependencies: 943 | p-locate "^5.0.0" 944 | 945 | lodash-es@^4.17.21: 946 | version "4.17.21" 947 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" 948 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== 949 | 950 | lodash-unified@^1.0.2: 951 | version "1.0.3" 952 | resolved "https://registry.yarnpkg.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894" 953 | integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== 954 | 955 | lodash@^4.17.21: 956 | version "4.17.21" 957 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 958 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 959 | 960 | lru-cache@^6.0.0: 961 | version "6.0.0" 962 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 963 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 964 | dependencies: 965 | yallist "^4.0.0" 966 | 967 | "lru-cache@^9.1.1 || ^10.0.0": 968 | version "10.0.0" 969 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" 970 | integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== 971 | 972 | magic-string@^0.30.0: 973 | version "0.30.0" 974 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" 975 | integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== 976 | dependencies: 977 | "@jridgewell/sourcemap-codec" "^1.4.13" 978 | 979 | marked@^4.2.3: 980 | version "4.3.0" 981 | resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" 982 | integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== 983 | 984 | memoize-one@^6.0.0: 985 | version "6.0.0" 986 | resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" 987 | integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== 988 | 989 | merge-stream@^2.0.0: 990 | version "2.0.0" 991 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 992 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 993 | 994 | merge2@^1.3.0: 995 | version "1.4.1" 996 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 997 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 998 | 999 | micromatch@^4.0.4: 1000 | version "4.0.5" 1001 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1002 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1003 | dependencies: 1004 | braces "^3.0.2" 1005 | picomatch "^2.3.1" 1006 | 1007 | mimic-fn@^2.1.0: 1008 | version "2.1.0" 1009 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1010 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1011 | 1012 | minimatch@^9.0.0, minimatch@^9.0.1: 1013 | version "9.0.2" 1014 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" 1015 | integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== 1016 | dependencies: 1017 | brace-expansion "^2.0.1" 1018 | 1019 | "minipass@^5.0.0 || ^6.0.2": 1020 | version "6.0.2" 1021 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" 1022 | integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== 1023 | 1024 | mlly@^1.2.0, mlly@^1.4.0: 1025 | version "1.4.0" 1026 | resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.0.tgz#830c10d63f1f97bd8785377b24dc2a15d972832b" 1027 | integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== 1028 | dependencies: 1029 | acorn "^8.9.0" 1030 | pathe "^1.1.1" 1031 | pkg-types "^1.0.3" 1032 | ufo "^1.1.2" 1033 | 1034 | moment@^2.29.4: 1035 | version "2.29.4" 1036 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" 1037 | integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== 1038 | 1039 | ms@2.1.2: 1040 | version "2.1.2" 1041 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1042 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1043 | 1044 | muggle-string@^0.3.1: 1045 | version "0.3.1" 1046 | resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a" 1047 | integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== 1048 | 1049 | nanoid@^3.3.6: 1050 | version "3.3.6" 1051 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" 1052 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 1053 | 1054 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1055 | version "3.0.0" 1056 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1057 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1058 | 1059 | normalize-wheel-es@^1.2.0: 1060 | version "1.2.0" 1061 | resolved "https://registry.yarnpkg.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e" 1062 | integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== 1063 | 1064 | npm-run-path@^4.0.1: 1065 | version "4.0.1" 1066 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1067 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1068 | dependencies: 1069 | path-key "^3.0.0" 1070 | 1071 | onetime@^5.1.2: 1072 | version "5.1.2" 1073 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1074 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1075 | dependencies: 1076 | mimic-fn "^2.1.0" 1077 | 1078 | p-limit@^3.0.2: 1079 | version "3.1.0" 1080 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1081 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1082 | dependencies: 1083 | yocto-queue "^0.1.0" 1084 | 1085 | p-locate@^5.0.0: 1086 | version "5.0.0" 1087 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1088 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1089 | dependencies: 1090 | p-limit "^3.0.2" 1091 | 1092 | parse-srcset@^1.0.2: 1093 | version "1.0.2" 1094 | resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" 1095 | integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== 1096 | 1097 | path-exists@^4.0.0: 1098 | version "4.0.0" 1099 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1100 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1101 | 1102 | path-key@^3.0.0, path-key@^3.1.0: 1103 | version "3.1.1" 1104 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1105 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1106 | 1107 | path-parse@^1.0.7: 1108 | version "1.0.7" 1109 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1110 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1111 | 1112 | path-scurry@^1.10.0: 1113 | version "1.10.0" 1114 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.0.tgz#0ffbd4c1f7de9600f98a1405507d9f9acb438ab3" 1115 | integrity sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g== 1116 | dependencies: 1117 | lru-cache "^9.1.1 || ^10.0.0" 1118 | minipass "^5.0.0 || ^6.0.2" 1119 | 1120 | pathe@^1.1.0, pathe@^1.1.1: 1121 | version "1.1.1" 1122 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" 1123 | integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== 1124 | 1125 | picocolors@^1.0.0: 1126 | version "1.0.0" 1127 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1128 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1129 | 1130 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1131 | version "2.3.1" 1132 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1133 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1134 | 1135 | pkg-types@^1.0.3: 1136 | version "1.0.3" 1137 | resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" 1138 | integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== 1139 | dependencies: 1140 | jsonc-parser "^3.2.0" 1141 | mlly "^1.2.0" 1142 | pathe "^1.1.0" 1143 | 1144 | plyr@^3.7.3: 1145 | version "3.7.8" 1146 | resolved "https://registry.yarnpkg.com/plyr/-/plyr-3.7.8.tgz#b79bccc23687705b5d9a283b2a88c124bf7471ed" 1147 | integrity sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA== 1148 | dependencies: 1149 | core-js "^3.26.1" 1150 | custom-event-polyfill "^1.0.7" 1151 | loadjs "^4.2.0" 1152 | rangetouch "^2.0.1" 1153 | url-polyfill "^1.1.12" 1154 | 1155 | postcss@^8.1.10, postcss@^8.3.11, postcss@^8.4.23: 1156 | version "8.4.24" 1157 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" 1158 | integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== 1159 | dependencies: 1160 | nanoid "^3.3.6" 1161 | picocolors "^1.0.0" 1162 | source-map-js "^1.0.2" 1163 | 1164 | queue-microtask@^1.2.2: 1165 | version "1.2.3" 1166 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1167 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1168 | 1169 | rangetouch@^2.0.1: 1170 | version "2.0.1" 1171 | resolved "https://registry.yarnpkg.com/rangetouch/-/rangetouch-2.0.1.tgz#c01105110fd3afca2adcb1a580692837d883cb70" 1172 | integrity sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA== 1173 | 1174 | readdirp@~3.6.0: 1175 | version "3.6.0" 1176 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1177 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1178 | dependencies: 1179 | picomatch "^2.2.1" 1180 | 1181 | resolve@^1.22.2: 1182 | version "1.22.2" 1183 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" 1184 | integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== 1185 | dependencies: 1186 | is-core-module "^2.11.0" 1187 | path-parse "^1.0.7" 1188 | supports-preserve-symlinks-flag "^1.0.0" 1189 | 1190 | reusify@^1.0.4: 1191 | version "1.0.4" 1192 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1193 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1194 | 1195 | rimraf@^5.0.1: 1196 | version "5.0.1" 1197 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" 1198 | integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== 1199 | dependencies: 1200 | glob "^10.2.5" 1201 | 1202 | rollup@^3.21.0: 1203 | version "3.26.0" 1204 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.0.tgz#9f2e0316a4ca641911cefd8515c562a9124e6130" 1205 | integrity sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg== 1206 | optionalDependencies: 1207 | fsevents "~2.3.2" 1208 | 1209 | run-parallel@^1.1.9: 1210 | version "1.2.0" 1211 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1212 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1213 | dependencies: 1214 | queue-microtask "^1.2.2" 1215 | 1216 | sanitize-html@^2.7.3: 1217 | version "2.11.0" 1218 | resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.11.0.tgz#9a6434ee8fcaeddc740d8ae7cd5dd71d3981f8f6" 1219 | integrity sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA== 1220 | dependencies: 1221 | deepmerge "^4.2.2" 1222 | escape-string-regexp "^4.0.0" 1223 | htmlparser2 "^8.0.0" 1224 | is-plain-object "^5.0.0" 1225 | parse-srcset "^1.0.2" 1226 | postcss "^8.3.11" 1227 | 1228 | sass@^1.50.0: 1229 | version "1.63.6" 1230 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" 1231 | integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== 1232 | dependencies: 1233 | chokidar ">=3.0.0 <4.0.0" 1234 | immutable "^4.0.0" 1235 | source-map-js ">=0.6.2 <2.0.0" 1236 | 1237 | scule@^1.0.0: 1238 | version "1.0.0" 1239 | resolved "https://registry.yarnpkg.com/scule/-/scule-1.0.0.tgz#895e6f4ba887e78d8b9b4111e23ae84fef82376d" 1240 | integrity sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ== 1241 | 1242 | semver@^7.3.8: 1243 | version "7.5.3" 1244 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" 1245 | integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== 1246 | dependencies: 1247 | lru-cache "^6.0.0" 1248 | 1249 | shebang-command@^2.0.0: 1250 | version "2.0.0" 1251 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1252 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1253 | dependencies: 1254 | shebang-regex "^3.0.0" 1255 | 1256 | shebang-regex@^3.0.0: 1257 | version "3.0.0" 1258 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1259 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1260 | 1261 | signal-exit@^3.0.3: 1262 | version "3.0.7" 1263 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1264 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1265 | 1266 | signal-exit@^4.0.1: 1267 | version "4.0.2" 1268 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" 1269 | integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== 1270 | 1271 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: 1272 | version "1.0.2" 1273 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1274 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1275 | 1276 | "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: 1277 | version "4.2.3" 1278 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1279 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1280 | dependencies: 1281 | emoji-regex "^8.0.0" 1282 | is-fullwidth-code-point "^3.0.0" 1283 | strip-ansi "^6.0.1" 1284 | 1285 | string-width@^5.0.1, string-width@^5.1.2: 1286 | version "5.1.2" 1287 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 1288 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1289 | dependencies: 1290 | eastasianwidth "^0.2.0" 1291 | emoji-regex "^9.2.2" 1292 | strip-ansi "^7.0.1" 1293 | 1294 | stringify-attributes@^3.0.0: 1295 | version "3.0.0" 1296 | resolved "https://registry.yarnpkg.com/stringify-attributes/-/stringify-attributes-3.0.0.tgz#10d8c3615924df47b70d28c848d71c8afb0a8e52" 1297 | integrity sha512-tJKiThlLfog6ljT7ZTihlMh0iAtjKlu/ss9DMmBE5oOosbMqOMcuxc7zDfxP2lGzSb2Bwvbd3gQTqTSCmXyySw== 1298 | dependencies: 1299 | escape-goat "^3.0.0" 1300 | 1301 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1302 | version "6.0.1" 1303 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1304 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1305 | dependencies: 1306 | ansi-regex "^5.0.1" 1307 | 1308 | strip-ansi@^7.0.1: 1309 | version "7.1.0" 1310 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1311 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1312 | dependencies: 1313 | ansi-regex "^6.0.1" 1314 | 1315 | strip-final-newline@^2.0.0: 1316 | version "2.0.0" 1317 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 1318 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1319 | 1320 | strip-literal@^1.0.1: 1321 | version "1.0.1" 1322 | resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" 1323 | integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== 1324 | dependencies: 1325 | acorn "^8.8.2" 1326 | 1327 | supports-preserve-symlinks-flag@^1.0.0: 1328 | version "1.0.0" 1329 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1330 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1331 | 1332 | to-regex-range@^5.0.1: 1333 | version "5.0.1" 1334 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1335 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1336 | dependencies: 1337 | is-number "^7.0.0" 1338 | 1339 | type-fest@^2.5.0: 1340 | version "2.19.0" 1341 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" 1342 | integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== 1343 | 1344 | typescript@^5.1.6: 1345 | version "5.1.6" 1346 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" 1347 | integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== 1348 | 1349 | ufo@^1.1.2: 1350 | version "1.1.2" 1351 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" 1352 | integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== 1353 | 1354 | unimport@^3.0.7: 1355 | version "3.0.11" 1356 | resolved "https://registry.yarnpkg.com/unimport/-/unimport-3.0.11.tgz#64b0e9dc508e1835737a2e333e75d7123db63120" 1357 | integrity sha512-UaaLu7TiqiEwjm5a9FGsL8RL87U65wyr1jBeIAAvLChgJZRMTTkknU9bkWjBsVGutXLT2Yq8/dPyWXSC3/ELRg== 1358 | dependencies: 1359 | "@rollup/pluginutils" "^5.0.2" 1360 | escape-string-regexp "^5.0.0" 1361 | fast-glob "^3.2.12" 1362 | local-pkg "^0.4.3" 1363 | magic-string "^0.30.0" 1364 | mlly "^1.4.0" 1365 | pathe "^1.1.1" 1366 | pkg-types "^1.0.3" 1367 | scule "^1.0.0" 1368 | strip-literal "^1.0.1" 1369 | unplugin "^1.3.1" 1370 | 1371 | unplugin-auto-import@^0.16.4: 1372 | version "0.16.4" 1373 | resolved "https://registry.yarnpkg.com/unplugin-auto-import/-/unplugin-auto-import-0.16.4.tgz#7b78de0c1ec92cc1a753a89d718ed23828576db9" 1374 | integrity sha512-xdgBa9NAS3JG8HjkAZHSbGSMlrjKpaWKXGUzaF6RzEtr980RCl1t0Zsu0skUInNYrEQfqaHc7aGWPv41DLTK/w== 1375 | dependencies: 1376 | "@antfu/utils" "^0.7.2" 1377 | "@rollup/pluginutils" "^5.0.2" 1378 | local-pkg "^0.4.3" 1379 | magic-string "^0.30.0" 1380 | minimatch "^9.0.1" 1381 | unimport "^3.0.7" 1382 | unplugin "^1.3.1" 1383 | 1384 | unplugin-icons@^0.16.3: 1385 | version "0.16.3" 1386 | resolved "https://registry.yarnpkg.com/unplugin-icons/-/unplugin-icons-0.16.3.tgz#2c8e5bedcb89309970eb8a3c09f051dcc3d06cf0" 1387 | integrity sha512-hivVVr6++WHSj6Iz+rjTa14/ALMYT+PFd2sPtTBKlQR3cdzui1VwM72TzSu94NkDm/KVncvOIiBwoHwUPeL9bg== 1388 | dependencies: 1389 | "@antfu/install-pkg" "^0.1.1" 1390 | "@antfu/utils" "^0.7.4" 1391 | "@iconify/utils" "^2.1.6" 1392 | debug "^4.3.4" 1393 | kolorist "^1.8.0" 1394 | local-pkg "^0.4.3" 1395 | unplugin "^1.3.1" 1396 | 1397 | unplugin-vue-components@^0.25.1: 1398 | version "0.25.1" 1399 | resolved "https://registry.yarnpkg.com/unplugin-vue-components/-/unplugin-vue-components-0.25.1.tgz#84e30374460e2e6e30b6c5bfa6127c11097c1065" 1400 | integrity sha512-kzS2ZHVMaGU2XEO2keYQcMjNZkanDSGDdY96uQT9EPe+wqSZwwgbFfKVJ5ti0+8rGAcKHColwKUvctBhq2LJ3A== 1401 | dependencies: 1402 | "@antfu/utils" "^0.7.4" 1403 | "@rollup/pluginutils" "^5.0.2" 1404 | chokidar "^3.5.3" 1405 | debug "^4.3.4" 1406 | fast-glob "^3.2.12" 1407 | local-pkg "^0.4.3" 1408 | magic-string "^0.30.0" 1409 | minimatch "^9.0.1" 1410 | resolve "^1.22.2" 1411 | unplugin "^1.3.1" 1412 | 1413 | unplugin@^1.3.1: 1414 | version "1.3.1" 1415 | resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.3.1.tgz#7af993ba8695d17d61b0845718380caf6af5109f" 1416 | integrity sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw== 1417 | dependencies: 1418 | acorn "^8.8.2" 1419 | chokidar "^3.5.3" 1420 | webpack-sources "^3.2.3" 1421 | webpack-virtual-modules "^0.5.0" 1422 | 1423 | url-join@^5.0.0: 1424 | version "5.0.0" 1425 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" 1426 | integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== 1427 | 1428 | url-polyfill@^1.1.12: 1429 | version "1.1.12" 1430 | resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" 1431 | integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== 1432 | 1433 | vite@^4.0.3: 1434 | version "4.3.9" 1435 | resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" 1436 | integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== 1437 | dependencies: 1438 | esbuild "^0.17.5" 1439 | postcss "^8.4.23" 1440 | rollup "^3.21.0" 1441 | optionalDependencies: 1442 | fsevents "~2.3.2" 1443 | 1444 | vue-class-component@^8.0.0-rc.1: 1445 | version "8.0.0-rc.1" 1446 | resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz#db692cd97656eb9a08206c03d0b7398cdb1d9420" 1447 | integrity sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ== 1448 | 1449 | vue-demi@*: 1450 | version "0.14.5" 1451 | resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.5.tgz#676d0463d1a1266d5ab5cba932e043d8f5f2fbd9" 1452 | integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== 1453 | 1454 | vue-property-decorator@^10.0.0-rc.3: 1455 | version "10.0.0-rc.3" 1456 | resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-10.0.0-rc.3.tgz#bb0cb2c7c31dc41149eb432f2104fb82dc3d95be" 1457 | integrity sha512-EGqjf8Lq+kTausZzfLB1ynWOcyay8ZLAc5p2VlKGEX2q+BjYw84oZxr6IcdwuxGIdNmriZqPUX6AlAluBdnbEg== 1458 | 1459 | vue-template-compiler@^2.7.14: 1460 | version "2.7.14" 1461 | resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1" 1462 | integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== 1463 | dependencies: 1464 | de-indent "^1.0.2" 1465 | he "^1.2.0" 1466 | 1467 | vue-tsc@^1.0.11: 1468 | version "1.8.3" 1469 | resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.3.tgz#246c0798717ec094e51809e027df48f4d85162e1" 1470 | integrity sha512-Ua4DHuYxjudlhCW2nRZtaXbhIDVncRGIbDjZhHpF8Z8vklct/G/35/kAPuGNSOmq0JcvhPAe28Oa7LWaUerZVA== 1471 | dependencies: 1472 | "@vue/language-core" "1.8.3" 1473 | "@vue/typescript" "1.8.3" 1474 | semver "^7.3.8" 1475 | 1476 | vue@^3.2.33: 1477 | version "3.3.4" 1478 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" 1479 | integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== 1480 | dependencies: 1481 | "@vue/compiler-dom" "3.3.4" 1482 | "@vue/compiler-sfc" "3.3.4" 1483 | "@vue/runtime-dom" "3.3.4" 1484 | "@vue/server-renderer" "3.3.4" 1485 | "@vue/shared" "3.3.4" 1486 | 1487 | webpack-sources@^3.2.3: 1488 | version "3.2.3" 1489 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 1490 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 1491 | 1492 | webpack-virtual-modules@^0.5.0: 1493 | version "0.5.0" 1494 | resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c" 1495 | integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== 1496 | 1497 | which@^2.0.1: 1498 | version "2.0.2" 1499 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1500 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1501 | dependencies: 1502 | isexe "^2.0.0" 1503 | 1504 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 1505 | version "7.0.0" 1506 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1507 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1508 | dependencies: 1509 | ansi-styles "^4.0.0" 1510 | string-width "^4.1.0" 1511 | strip-ansi "^6.0.0" 1512 | 1513 | wrap-ansi@^8.1.0: 1514 | version "8.1.0" 1515 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 1516 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 1517 | dependencies: 1518 | ansi-styles "^6.1.0" 1519 | string-width "^5.0.1" 1520 | strip-ansi "^7.0.1" 1521 | 1522 | yallist@^4.0.0: 1523 | version "4.0.0" 1524 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1525 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1526 | 1527 | yocto-queue@^0.1.0: 1528 | version "0.1.0" 1529 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1530 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1531 | --------------------------------------------------------------------------------