Repository: Dooy/chatgpt-web-midjourney-proxy Branch: main Commit: a72e12f96c22 Files: 304 Total size: 2.5 MB Directory structure: gitextract_728oqv5o/ ├── .commitlintrc.json ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.cjs ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── desktop.yml │ └── docker-image.yml ├── .gitignore ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .npmrc ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── 2package-lock.json ├── CHANGELOG.md ├── CONTRIBUTING.en.md ├── CONTRIBUTING.md ├── Dockerfile ├── README.md ├── README_EN.md ├── README_FR.md ├── README_KR.md ├── README_RU.md ├── README_TR.md ├── README_VN.md ├── README_ZH.md ├── SPONSOR.md ├── api/ │ ├── proxy.js │ ├── session.js │ ├── verify.js │ └── webdav-proxy.js ├── changlog.md ├── docker-compose/ │ ├── docker-compose.yml │ ├── gpt-mj/ │ │ ├── deploy.sh │ │ ├── docker-compose.yml │ │ └── readme.md │ ├── gpts-mj-file/ │ │ ├── docker-compose.yml │ │ ├── nginx/ │ │ │ └── nginx.conf │ │ ├── readme.md │ │ ├── start.sh │ │ └── start_h.sh │ └── readme.md ├── index.html ├── kubernetes/ │ ├── README.md │ ├── deploy.yaml │ └── ingress.yaml ├── license ├── package.json ├── postcss.config.js ├── public/ │ └── gpts.json ├── service/ │ ├── .eslintrc.json │ ├── .gitignore │ ├── .npmrc │ ├── .vscode/ │ │ ├── extensions.json │ │ └── settings.json │ ├── package.json │ ├── src/ │ │ ├── chatgpt/ │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── index.ts │ │ ├── middleware/ │ │ │ ├── auth.ts │ │ │ └── limiter.ts │ │ ├── myfun.ts │ │ ├── types.ts │ │ └── utils/ │ │ ├── index.ts │ │ └── is.ts │ ├── tsconfig.json │ └── tsup.config.ts ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── Recognition.ts │ │ ├── chat.ts │ │ ├── dtoStore.ts │ │ ├── ideo.ts │ │ ├── index.ts │ │ ├── kling.ts │ │ ├── klingStore.ts │ │ ├── luma.ts │ │ ├── lumaStore.ts │ │ ├── mic.ts │ │ ├── mjapi.ts │ │ ├── mjsave.ts │ │ ├── mp4img.ts │ │ ├── openapi.ts │ │ ├── pika.ts │ │ ├── pikaStore.ts │ │ ├── pixverse.ts │ │ ├── pixverseStore.ts │ │ ├── realtime.ts │ │ ├── riff.ts │ │ ├── riffStore.ts │ │ ├── runway.ts │ │ ├── runwayStore.ts │ │ ├── runwayml.ts │ │ ├── runwaymlStore.ts │ │ ├── sse/ │ │ │ ├── fetch.ts │ │ │ ├── fetchsse.ts │ │ │ ├── stream-async-iterable.ts │ │ │ └── types.ts │ │ ├── suno.ts │ │ ├── sunoStore.ts │ │ ├── udio.ts │ │ ├── udioStore.ts │ │ ├── units.ts │ │ ├── viggle.ts │ │ └── viggleStore.ts │ ├── assets/ │ │ └── recommend.json │ ├── components/ │ │ ├── common/ │ │ │ ├── HoverButton/ │ │ │ │ ├── Button.vue │ │ │ │ └── index.vue │ │ │ ├── NaiveProvider/ │ │ │ │ └── index.vue │ │ │ ├── PromptStore/ │ │ │ │ └── index.vue │ │ │ ├── Setting/ │ │ │ │ ├── About.vue │ │ │ │ ├── Advanced.vue │ │ │ │ ├── General.vue │ │ │ │ └── index.vue │ │ │ ├── SvgIcon/ │ │ │ │ └── index.vue │ │ │ ├── UserAvatar/ │ │ │ │ └── index.vue │ │ │ └── index.ts │ │ └── custom/ │ │ ├── GithubSite.vue │ │ └── index.ts │ ├── hooks/ │ │ ├── useBasicLayout.ts │ │ ├── useIconRender.ts │ │ ├── useLanguage.ts │ │ └── useTheme.ts │ ├── icons/ │ │ ├── 403.vue │ │ └── 500.vue │ ├── lib/ │ │ └── wavtools/ │ │ ├── index.js │ │ └── lib/ │ │ ├── analysis/ │ │ │ ├── audio_analysis.js │ │ │ └── constants.js │ │ ├── wav_packer.js │ │ ├── wav_recorder.js │ │ ├── wav_stream_player.js │ │ └── worklets/ │ │ ├── audio_processor.js │ │ └── stream_processor.js │ ├── locales/ │ │ ├── en-US.ts │ │ ├── fr-FR.ts │ │ ├── index.ts │ │ ├── ko-KR.ts │ │ ├── ru-RU.ts │ │ ├── tr-TR.ts │ │ ├── vi-VN.ts │ │ ├── zh-CN.ts │ │ └── zh-TW.ts │ ├── main.ts │ ├── plugins/ │ │ ├── assets.ts │ │ ├── index.ts │ │ └── scrollbarStyle.ts │ ├── router/ │ │ ├── index.ts │ │ └── permission.ts │ ├── static/ │ │ └── mitf/ │ │ ├── assets/ │ │ │ ├── mj.js │ │ │ └── style.css │ │ └── index.html │ ├── store/ │ │ ├── helper.ts │ │ ├── homeStore.ts │ │ ├── index.ts │ │ └── modules/ │ │ ├── app/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── auth/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── chat/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── prompt/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ ├── settings/ │ │ │ ├── helper.ts │ │ │ └── index.ts │ │ └── user/ │ │ ├── helper.ts │ │ └── index.ts │ ├── styles/ │ │ ├── global.less │ │ └── lib/ │ │ ├── github-markdown.less │ │ ├── highlight.less │ │ └── tailwind.css │ ├── typings/ │ │ ├── chat.d.ts │ │ ├── env.d.ts │ │ └── global.d.ts │ ├── utils/ │ │ ├── copy.ts │ │ ├── functions/ │ │ │ ├── debounce.ts │ │ │ └── index.ts │ │ ├── is/ │ │ │ └── index.ts │ │ ├── request/ │ │ │ ├── axios.ts │ │ │ └── index.ts │ │ ├── storage/ │ │ │ └── index.ts │ │ ├── wav_renderer.ts │ │ └── webdav.ts │ └── views/ │ ├── chat/ │ │ ├── components/ │ │ │ ├── Header/ │ │ │ │ └── index.vue │ │ │ ├── Message/ │ │ │ │ ├── Avatar.vue │ │ │ │ ├── Text.vue │ │ │ │ ├── index.vue │ │ │ │ └── style.less │ │ │ └── index.ts │ │ ├── hooks/ │ │ │ ├── useChat.ts │ │ │ ├── useScroll.ts │ │ │ └── useUsingContext.ts │ │ ├── index.vue │ │ └── layout/ │ │ ├── Layout.vue │ │ ├── Permission.vue │ │ ├── index.ts │ │ └── sider/ │ │ ├── Footer.vue │ │ ├── List.vue │ │ └── index.vue │ ├── exception/ │ │ ├── 404/ │ │ │ └── index.vue │ │ └── 500/ │ │ └── index.vue │ ├── kling/ │ │ ├── kgImage.vue │ │ ├── kgInput.vue │ │ ├── kgInputImage.vue │ │ ├── kgInputVideo.vue │ │ └── kgList.vue │ ├── luma/ │ │ ├── layout.vue │ │ ├── lumaInput.vue │ │ ├── pikaInput.vue │ │ ├── pikaList.vue │ │ ├── pixCamera.json │ │ ├── pixEffact.json │ │ ├── pixInput.vue │ │ ├── pixList.vue │ │ ├── runInput.vue │ │ ├── runmlInput.vue │ │ ├── runmlList.vue │ │ ├── runwayInput.vue │ │ ├── runwayList.vue │ │ ├── video.vue │ │ ├── voInput.vue │ │ └── voList.vue │ ├── mj/ │ │ ├── aiBlend.vue │ │ ├── aiCanvas.vue │ │ ├── aiDall.vue │ │ ├── aiDrawInput.vue │ │ ├── aiDrawInputItem.vue │ │ ├── aiEditImage.vue │ │ ├── aiEditVidoe.vue │ │ ├── aiFace.vue │ │ ├── aiFooter.vue │ │ ├── aiGallery.vue │ │ ├── aiGalleryItem.vue │ │ ├── aiGpt.vue │ │ ├── aiGptInput.vue │ │ ├── aiGpts.vue │ │ ├── aiGptsAdd.vue │ │ ├── aiGptsCom.vue │ │ ├── aiIdeoInput.vue │ │ ├── aiListText.vue │ │ ├── aiMic.vue │ │ ├── aiMobileMenu.vue │ │ ├── aiModel.vue │ │ ├── aiModelServer.vue │ │ ├── aiMsg.vue │ │ ├── aiOther.vue │ │ ├── aiSetAuth.vue │ │ ├── aiSetServer.vue │ │ ├── aiSider.vue │ │ ├── aiSiderInput.vue │ │ ├── aiTextSetting.vue │ │ ├── dallText.vue │ │ ├── draw.json │ │ ├── draw.vue │ │ ├── drawList.vue │ │ ├── index.ts │ │ ├── layout.vue │ │ ├── mjText.vue │ │ ├── mjTextAttr.vue │ │ ├── myTest.vue │ │ ├── ttsText.vue │ │ └── whisperText.vue │ ├── suno/ │ │ ├── layout.vue │ │ ├── mcInput.vue │ │ ├── mcList.vue │ │ ├── mcUploadMp3.vue │ │ ├── mcplayer.vue │ │ ├── music.vue │ │ ├── player.vue │ │ ├── playui.vue │ │ ├── riffInput.vue │ │ ├── riffList.vue │ │ ├── udioInput.vue │ │ └── udioList.vue │ ├── video/ │ │ ├── image-base64-array.vue │ │ ├── input.vue │ │ ├── list.vue │ │ ├── tpl.json │ │ ├── tpl.ts │ │ └── veo.ts │ ├── viggle/ │ │ ├── dance.vue │ │ ├── dcInput.vue │ │ ├── dcList.vue │ │ └── dcTemple.vue │ └── wav/ │ ├── an_main.vue │ ├── css/ │ │ └── in-and-out.css │ ├── realtime.vue │ ├── realtimeLayout.vue │ ├── wav.vue │ └── wavSetting.vue ├── src-tauri/ │ ├── .gitignore │ ├── Cargo.toml │ ├── build.rs │ ├── icons/ │ │ └── icon.icns │ ├── icons_bak/ │ │ └── icon.icns │ ├── src/ │ │ └── main.rs │ └── tauri.conf.json ├── start.cmd ├── start.sh ├── tailwind.config.js ├── tauri_debug.sh ├── tsconfig.json ├── vercel.json └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .commitlintrc.json ================================================ { "extends": ["@commitlint/config-conventional"] } ================================================ FILE: .dockerignore ================================================ **/node_modules */node_modules node_modules Dockerfile .* */.* !.env ================================================ FILE: .editorconfig ================================================ # Editor configuration, see http://editorconfig.org root = true [*] charset = utf-8 indent_style = tab indent_size = 2 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true ================================================ FILE: .eslintignore ================================================ docker-compose kubernetes ================================================ FILE: .eslintrc.cjs ================================================ module.exports = { root: true, extends: ['@antfu'], } ================================================ FILE: .gitattributes ================================================ "*.vue" eol=lf "*.js" eol=lf "*.ts" eol=lf "*.jsx" eol=lf "*.tsx" eol=lf "*.cjs" eol=lf "*.cts" eol=lf "*.mjs" eol=lf "*.mts" eol=lf "*.json" eol=lf "*.html" eol=lf "*.css" eol=lf "*.less" eol=lf "*.scss" eol=lf "*.sass" eol=lf "*.styl" eol=lf "*.md" eol=lf ================================================ FILE: .github/workflows/desktop.yml ================================================ name: Release Desktop on: workflow_dispatch: release: types: [published] jobs: create-release: permissions: contents: write runs-on: ubuntu-latest outputs: release_id: ${{ steps.create-release.outputs.result }} steps: - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 with: node-version: 20 - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV - name: create release id: create-release uses: actions/github-script@v6 with: script: | const { data } = await github.rest.repos.getLatestRelease({ owner: context.repo.owner, repo: context.repo.repo, }) return data.id build-tauri: needs: create-release permissions: contents: write strategy: fail-fast: false matrix: config: # - os: ubuntu-latest # arch: x86_64 # rust_target: x86_64-unknown-linux-gnu - os: macos-latest arch: aarch64 rust_target: x86_64-apple-darwin,aarch64-apple-darwin - os: windows-latest arch: x86_64 rust_target: x86_64-pc-windows-msvc runs-on: ${{ matrix.config.os }} steps: - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 with: node-version: 20 cache: 'yarn' - name: install Rust stable uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.config.rust_target }} - uses: Swatinem/rust-cache@v2 with: key: ${{ matrix.config.os }} - name: install dependencies (ubuntu only) if: matrix.config.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf - name: install frontend dependencies #run: yarn config set registry https://registry.npmjs.org/ && yarn install #run: yarn install # change this to npm or pnpm or yarn depending on which one you use # run: | # yarn config set registry https://registry.npmjs.org/ # yarn cache clean # yarn install run: | npm install -g pnpm pnpm install - uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: releaseId: ${{ needs.create-release.outputs.release_id }} args: ${{ matrix.config.os == 'macos-latest' && '--target universal-apple-darwin' || '' }} publish-release: permissions: contents: write runs-on: ubuntu-latest needs: [create-release, build-tauri] steps: - name: publish release id: publish-release uses: actions/github-script@v6 env: release_id: ${{ needs.create-release.outputs.release_id }} with: script: | github.rest.repos.updateRelease({ owner: context.repo.owner, repo: context.repo.repo, release_id: process.env.release_id, draft: false, prerelease: false }) ================================================ FILE: .github/workflows/docker-image.yml ================================================ name: Publish Docker image on: workflow_dispatch: release: types: [published] jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v3 - run: | echo 本次构建的版本为:${{ github.ref_name }} echo 账号:${{ secrets.DOCKER_USERNAME }} env - name: Log in to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v4 with: images: ydlhero/chatgpt-web-midjourney-proxy tags: | type=raw,value=latest type=ref,event=tag - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build and push Docker image uses: docker/build-push-action@v4 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: ${{ inputs.use-cache == 'true' && 'type=gha' || 'type=local,src=/tmp' }} cache-to: ${{ inputs.use-cache == 'true' && 'type=gha, mode=max' || 'type=local,dest=/tmp' }} ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules .DS_Store dist dist-ssr coverage *.local /cypress/videos/ /cypress/screenshots/ # Editor directories and files .vscode/* !.vscode/settings.json !.vscode/extensions.json .idea *.suo *.ntvs* *.njsproj *.sln *.sw? # Environment variables files /service/.env /service/uploads ================================================ FILE: .husky/commit-msg ================================================ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx --no -- commitlint --edit ================================================ FILE: .husky/pre-commit ================================================ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx lint-staged ================================================ FILE: .npmrc ================================================ strict-peer-dependencies=false ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": ["Vue.volar", "dbaeumer.vscode-eslint"] } ================================================ FILE: .vscode/settings.json ================================================ { "prettier.enable": false, "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, "eslint.validate": [ "javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "html", "json", "jsonc", "json5", "yaml", "yml", "markdown" ], "cSpell.words": [ "antfu", "axios", "bumpp", "chatgpt", "chenzhaoyu", "commitlint", "davinci", "dockerhub", "esno", "GPTAPI", "highlightjs", "hljs", "iconify", "katex", "katexmath", "linkify", "logprobs", "mdhljs", "mila", "nodata", "OPENAI", "pinia", "Popconfirm", "rushstack", "Sider", "tailwindcss", "traptitech", "tsup", "Typecheck", "unplugin", "VITE", "vueuse", "Zhao" ], "i18n-ally.enabledParsers": [ "ts" ], "i18n-ally.sortKeys": true, "i18n-ally.keepFulfilled": true, "i18n-ally.localesPaths": [ "src/locales" ], "i18n-ally.keystyle": "nested" } ================================================ FILE: 2package-lock.json ================================================ { "name": "chatgpt-web", "version": "2.10.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "chatgpt-web", "version": "2.10.9", "dependencies": { "@traptitech/markdown-it-katex": "^3.6.0", "@vueuse/core": "^9.13.0", "highlight.js": "^11.7.0", "html2canvas": "^1.4.1", "katex": "^0.16.4", "markdown-it": "^13.0.1", "naive-ui": "^2.34.3", "pinia": "^2.0.33", "vue": "^3.2.47", "vue-i18n": "^9.2.2", "vue-router": "^4.1.6" }, "devDependencies": { "@antfu/eslint-config": "^0.35.3", "@commitlint/cli": "^17.4.4", "@commitlint/config-conventional": "^17.4.4", "@iconify/vue": "^4.1.0", "@types/crypto-js": "^4.1.1", "@types/katex": "^0.16.0", "@types/markdown-it": "^12.2.3", "@types/markdown-it-link-attributes": "^3.0.1", "@types/node": "^18.14.6", "@vitejs/plugin-vue": "^4.0.0", "autoprefixer": "^10.4.13", "axios": "^1.3.4", "crypto-js": "^4.1.1", "eslint": "^8.35.0", "husky": "^8.0.3", "less": "^4.1.3", "lint-staged": "^13.1.2", "markdown-it-link-attributes": "^4.0.1", "npm-run-all": "^4.1.5", "postcss": "^8.4.21", "rimraf": "^4.2.0", "tailwindcss": "^3.2.7", "typescript": "~4.9.5", "vite": "^4.2.0", "vite-plugin-pwa": "^0.14.4", "vue-tsc": "^1.2.0" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@antfu/eslint-config": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-0.35.3.tgz", "integrity": "sha512-wd0ry/TNqaZmniqkKtZKoCvpl55x9YbHgL5Ug3H9rVuUSqaNi9G9AjYlynQqn4/M1EhYYWO597Lu7f/fC+csrg==", "dev": true, "dependencies": { "@antfu/eslint-config-vue": "0.35.3", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsonc": "^2.6.0", "eslint-plugin-n": "^15.6.1", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^45.0.2", "eslint-plugin-vue": "^9.9.0", "eslint-plugin-yml": "^1.5.0", "jsonc-eslint-parser": "^2.1.0", "yaml-eslint-parser": "^1.1.0" }, "peerDependencies": { "eslint": ">=7.4.0" } }, "node_modules/@antfu/eslint-config-basic": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-basic/-/eslint-config-basic-0.35.3.tgz", "integrity": "sha512-NbWJKNgd3Ky3/ok2Z88cXNme/6I9otkiaB+FYLFgQE81sfMAhKpLKXtTSwzdcKMzhKDqUchAijt0BxjE/mcTJg==", "dev": true, "dependencies": { "eslint-plugin-antfu": "0.35.3", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsonc": "^2.6.0", "eslint-plugin-markdown": "^3.0.0", "eslint-plugin-n": "^15.6.1", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^45.0.2", "eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-yml": "^1.5.0", "jsonc-eslint-parser": "^2.1.0", "yaml-eslint-parser": "^1.1.0" }, "peerDependencies": { "eslint": ">=7.4.0" } }, "node_modules/@antfu/eslint-config-ts": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-ts/-/eslint-config-ts-0.35.3.tgz", "integrity": "sha512-FS5hir2ghXYlJWAiB2bpT9oAr0kpSNmYbaJWWkztocJG95AORl4tWzxMTkLT+TxaOmhuwJszcrMTHy5RgHL8/w==", "dev": true, "dependencies": { "@antfu/eslint-config-basic": "0.35.3", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", "eslint-plugin-jest": "^27.2.1" }, "peerDependencies": { "eslint": ">=7.4.0", "typescript": ">=3.9" } }, "node_modules/@antfu/eslint-config-vue": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-vue/-/eslint-config-vue-0.35.3.tgz", "integrity": "sha512-BA3vGLyuzqtEUb9gfgE7YzBT+a4oUnQuUPasIUfN/BVXaEhRVYlMmUgxN4ekQLuzOgUjUH13lqplXtkLJ62t9g==", "dev": true, "dependencies": { "@antfu/eslint-config-basic": "0.35.3", "@antfu/eslint-config-ts": "0.35.3", "eslint-plugin-vue": "^9.9.0", "local-pkg": "^0.4.3" }, "peerDependencies": { "eslint": ">=7.4.0" } }, "node_modules/@apideck/better-ajv-errors": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "engines": { "node": ">=10" }, "peerDependencies": { "ajv": ">=8" } }, "node_modules/@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.21.4", "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.4", "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "dependencies": { "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.21.4", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "dependencies": { "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.2", "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "dependencies": { "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.0", "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/@babel/parser": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.21.2", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.21.4", "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.21.0", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.0", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.20.7", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", "@babel/plugin-transform-computed-properties": "^7.20.7", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.21.0", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", "@babel/plugin-transform-modules-commonjs": "^7.21.2", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.20.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.21.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true }, "node_modules/@babel/runtime": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.21.4", "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/types": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@commitlint/cli": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.1.tgz", "integrity": "sha512-kCnDD9LE2ySiTnj/VPaxy4/oRayRcdv4aCuVxtoum8SxIU7OADHc0nJPQfheE8bHcs3zZdWzDMWltRosuT13bg==", "dev": true, "dependencies": { "@commitlint/format": "^17.4.4", "@commitlint/lint": "^17.6.1", "@commitlint/load": "^17.5.0", "@commitlint/read": "^17.5.1", "@commitlint/types": "^17.4.4", "execa": "^5.0.0", "lodash.isfunction": "^3.0.9", "resolve-from": "5.0.0", "resolve-global": "1.0.0", "yargs": "^17.0.0" }, "bin": { "commitlint": "cli.js" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/config-conventional": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.1.tgz", "integrity": "sha512-ng/ybaSLuTCH9F+7uavSOnEQ9EFMl7lHEjfAEgRh1hwmEe8SpLKpQeMo2aT1IWvHaGMuTb+gjfbzoRf2IR23NQ==", "dev": true, "dependencies": { "conventional-changelog-conventionalcommits": "^5.0.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/config-validator": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", "ajv": "^8.11.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/ensure": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "lodash.startcase": "^4.4.0", "lodash.upperfirst": "^4.3.1" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/execute-rule": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/format": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", "chalk": "^4.1.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/is-ignored": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz", "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", "semver": "7.3.8" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/lint": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.1.tgz", "integrity": "sha512-VARJ9kxH64isgwVnC+ABPafCYzqxpsWJIpDaTuI0gh8aX4GQ0i7cn9tvxtFNfJj4ER2BAJeWJ0vURdNYjK2RQQ==", "dev": true, "dependencies": { "@commitlint/is-ignored": "^17.4.4", "@commitlint/parse": "^17.4.4", "@commitlint/rules": "^17.6.1", "@commitlint/types": "^17.4.4" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/load": { "version": "17.5.0", "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", "dev": true, "dependencies": { "@commitlint/config-validator": "^17.4.4", "@commitlint/execute-rule": "^17.4.0", "@commitlint/resolve-extends": "^17.4.4", "@commitlint/types": "^17.4.4", "@types/node": "*", "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", "cosmiconfig-typescript-loader": "^4.0.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", "typescript": "^4.6.4 || ^5.0.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/message": { "version": "17.4.2", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", "conventional-changelog-angular": "^5.0.11", "conventional-commits-parser": "^3.2.2" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/read": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, "dependencies": { "@commitlint/top-level": "^17.4.0", "@commitlint/types": "^17.4.4", "fs-extra": "^11.0.0", "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/resolve-extends": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", "dev": true, "dependencies": { "@commitlint/config-validator": "^17.4.4", "@commitlint/types": "^17.4.4", "import-fresh": "^3.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/rules": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.1.tgz", "integrity": "sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==", "dev": true, "dependencies": { "@commitlint/ensure": "^17.4.4", "@commitlint/message": "^17.4.2", "@commitlint/to-lines": "^17.4.0", "@commitlint/types": "^17.4.4", "execa": "^5.0.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/to-lines": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/top-level": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", "dev": true, "dependencies": { "find-up": "^5.0.0" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/types": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, "dependencies": { "chalk": "^4.1.0" }, "engines": { "node": ">=v14" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@css-render/plugin-bem": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.12.tgz", "integrity": "sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==", "peerDependencies": { "css-render": "~0.15.12" } }, "node_modules/@css-render/vue3-ssr": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.12.tgz", "integrity": "sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==", "peerDependencies": { "vue": "^3.0.11" } }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@esbuild/android-arm": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", "cpu": [ "arm" ], "dev": true, "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/android-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "darwin" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "darwin" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", "cpu": [ "arm" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", "cpu": [ "ia32" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", "cpu": [ "loong64" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", "cpu": [ "mips64el" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", "cpu": [ "ppc64" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", "cpu": [ "riscv64" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", "cpu": [ "s390x" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "sunos" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", "cpu": [ "ia32" ], "dev": true, "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/@eslint/js": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "dev": true }, "node_modules/@iconify/vue": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.1.tgz", "integrity": "sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==", "dev": true, "dependencies": { "@iconify/types": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/cyberalien" }, "peerDependencies": { "vue": ">=3" } }, "node_modules/@intlify/core-base": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", "dependencies": { "@intlify/devtools-if": "9.2.2", "@intlify/message-compiler": "9.2.2", "@intlify/shared": "9.2.2", "@intlify/vue-devtools": "9.2.2" }, "engines": { "node": ">= 14" } }, "node_modules/@intlify/devtools-if": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", "dependencies": { "@intlify/shared": "9.2.2" }, "engines": { "node": ">= 14" } }, "node_modules/@intlify/message-compiler": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", "dependencies": { "@intlify/shared": "9.2.2", "source-map": "0.6.1" }, "engines": { "node": ">= 14" } }, "node_modules/@intlify/shared": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", "engines": { "node": ">= 14" } }, "node_modules/@intlify/vue-devtools": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", "dependencies": { "@intlify/core-base": "9.2.2", "@intlify/shared": "9.2.2" }, "engines": { "node": ">= 14" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@rollup/plugin-replace": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.27.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/pluginutils": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", "magic-string": "^0.25.0", "string.prototype.matchall": "^4.0.6" } }, "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/@traptitech/markdown-it-katex": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@traptitech/markdown-it-katex/-/markdown-it-katex-3.6.0.tgz", "integrity": "sha512-CnJzTWxsgLGXFdSrWRaGz7GZ1kUUi8g3E9HzJmeveX1YwVJavrKYqysktfHZQsujdnRqV5O7g8FPKEA/aeTkOQ==", "dependencies": { "katex": "^0.16.0" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, "node_modules/@types/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", "dev": true }, "node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/katex": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==", "dev": true }, "node_modules/@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, "node_modules/@types/lodash": { "version": "4.14.194", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "node_modules/@types/lodash-es": { "version": "4.17.7", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/markdown-it": { "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dev": true, "dependencies": { "@types/linkify-it": "*", "@types/mdurl": "*" } }, "node_modules/@types/markdown-it-link-attributes": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.1.tgz", "integrity": "sha512-K8RnNb1q8j7rDOJbMF7AnlhCC/45BjrQ8z3WZWOrvkBIl8u9RXvmBdG/hfpnmK1JhhEZcmFEKWt+ilW1Mly+2Q==", "dev": true, "dependencies": { "@types/markdown-it": "*" } }, "node_modules/@types/mdast": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mdurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "node_modules/@types/node": { "version": "18.16.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "node_modules/@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, "node_modules/@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/type-utils": "5.59.0", "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/parser": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "dependencies": { "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/types": "5.59.0", "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.0", "@typescript-eslint/visitor-keys": "5.59.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "dependencies": { "@typescript-eslint/typescript-estree": "5.59.0", "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "*" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/types": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.0", "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/types": "5.59.0", "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@vitejs/plugin-vue": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz", "integrity": "sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==", "dev": true, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { "vite": "^4.0.0", "vue": "^3.2.25" } }, "node_modules/@volar/language-core": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", "dev": true, "dependencies": { "@volar/source-map": "1.4.1" } }, "node_modules/@volar/source-map": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.1.tgz", "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", "dev": true, "dependencies": { "muggle-string": "^0.2.2" } }, "node_modules/@volar/typescript": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.4.1.tgz", "integrity": "sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==", "dev": true, "dependencies": { "@volar/language-core": "1.4.1" }, "peerDependencies": { "typescript": "*" } }, "node_modules/@volar/vue-language-core": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.4.4.tgz", "integrity": "sha512-c3hL6un+CfoOlusGvpypcodmk9ke/ImrWIUc0GkgI+imoQpUGzgu3tEQWlPs604R7AhxeZwWUi8hQNfax0R/zA==", "dev": true, "dependencies": { "@volar/language-core": "1.4.1", "@volar/source-map": "1.4.1", "@vue/compiler-dom": "^3.2.0", "@vue/compiler-sfc": "^3.2.0", "@vue/reactivity": "^3.2.0", "@vue/shared": "^3.2.0", "minimatch": "^9.0.0", "muggle-string": "^0.2.2", "vue-template-compiler": "^2.7.14" } }, "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@volar/vue-language-core/node_modules/minimatch": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@volar/vue-typescript": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.4.4.tgz", "integrity": "sha512-L61Fk15jlJw3QtIddD4cVE5jei5i6zbLJRiaEMYDDnUKB259/qUrdvnMfnZUFVyDwlevzdstjtaUyreeG/0nPQ==", "dev": true, "dependencies": { "@volar/typescript": "1.4.1", "@volar/vue-language-core": "1.4.4" }, "peerDependencies": { "typescript": "*" } }, "node_modules/@vue/compiler-core": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", "dependencies": { "@babel/parser": "^7.16.4", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", "dependencies": { "@vue/compiler-core": "3.2.47", "@vue/shared": "3.2.47" } }, "node_modules/@vue/compiler-sfc": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", "@vue/compiler-dom": "3.2.47", "@vue/compiler-ssr": "3.2.47", "@vue/reactivity-transform": "3.2.47", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-sfc/node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/@vue/compiler-ssr": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", "dependencies": { "@vue/compiler-dom": "3.2.47", "@vue/shared": "3.2.47" } }, "node_modules/@vue/devtools-api": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "node_modules/@vue/reactivity": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", "dependencies": { "@vue/shared": "3.2.47" } }, "node_modules/@vue/reactivity-transform": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/reactivity-transform/node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/@vue/runtime-core": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", "dependencies": { "@vue/reactivity": "3.2.47", "@vue/shared": "3.2.47" } }, "node_modules/@vue/runtime-dom": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", "dependencies": { "@vue/runtime-core": "3.2.47", "@vue/shared": "3.2.47", "csstype": "^2.6.8" } }, "node_modules/@vue/runtime-dom/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "node_modules/@vue/server-renderer": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", "dependencies": { "@vue/compiler-ssr": "3.2.47", "@vue/shared": "3.2.47" }, "peerDependencies": { "vue": "3.2.47" } }, "node_modules/@vue/shared": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, "node_modules/@vueuse/core": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "dependencies": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", "@vueuse/shared": "9.13.0", "vue-demi": "*" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "hasInstallScript": true, "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/@vueuse/metadata": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "dependencies": { "vue-demi": "*" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "hasInstallScript": true, "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" } ], "dependencies": { "browserslist": "^4.21.5", "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "bin": { "autoprefixer": "bin/autoprefixer" }, "engines": { "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/axios": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz", "integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", "engines": { "node": ">= 0.6.0" } }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { "semver": "^7.0.0" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { "version": "1.0.30001481", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "engines": { "node": ">=8" } }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, "engines": { "node": ">=4" } }, "node_modules/clean-regexp/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" } }, "node_modules/cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "engines": { "node": ">= 12" } }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, "engines": { "node": ">=4.0.0" } }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/conventional-changelog-angular": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "dependencies": { "compare-func": "^2.0.0", "q": "^1.5.1" }, "engines": { "node": ">=10" } }, "node_modules/conventional-changelog-conventionalcommits": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", "dev": true, "dependencies": { "compare-func": "^2.0.0", "lodash": "^4.17.15", "q": "^1.5.1" }, "engines": { "node": ">=10" } }, "node_modules/conventional-commits-parser": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "dependencies": { "is-text-path": "^1.0.1", "JSONStream": "^1.0.4", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.js" }, "engines": { "node": ">=10" } }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "dependencies": { "is-what": "^3.14.1" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/core-js-compat": { "version": "3.30.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", "dev": true, "dependencies": { "browserslist": "^4.21.5" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/cosmiconfig": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" } }, "node_modules/cosmiconfig-typescript-loader": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", "dev": true, "engines": { "node": ">=12", "npm": ">=6" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=7", "ts-node": ">=10", "typescript": ">=3" } }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", "dev": true }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", "dependencies": { "utrie": "^1.0.2" } }, "node_modules/css-render": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.12.tgz", "integrity": "sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==", "dependencies": { "@emotion/hash": "~0.8.0", "csstype": "~3.0.5" } }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "bin": { "cssesc": "bin/cssesc" }, "engines": { "node": ">=4" } }, "node_modules/csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "engines": { "node": ">=0.11" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/date-fns" } }, "node_modules/date-fns-tz": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", "peerDependencies": { "date-fns": ">=2.0.0" } }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, "engines": { "node": ">=0.10.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "dependencies": { "is-obj": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" }, "engines": { "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { "version": "1.4.369", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.369.tgz", "integrity": "sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==", "dev": true }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "optional": true, "dependencies": { "prr": "~1.0.1" }, "bin": { "errno": "cli.js" } }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/esbuild": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { "node": ">=12" }, "optionalDependencies": { "@esbuild/android-arm": "0.17.18", "@esbuild/android-arm64": "0.17.18", "@esbuild/android-x64": "0.17.18", "@esbuild/darwin-arm64": "0.17.18", "@esbuild/darwin-x64": "0.17.18", "@esbuild/freebsd-arm64": "0.17.18", "@esbuild/freebsd-x64": "0.17.18", "@esbuild/linux-arm": "0.17.18", "@esbuild/linux-arm64": "0.17.18", "@esbuild/linux-ia32": "0.17.18", "@esbuild/linux-loong64": "0.17.18", "@esbuild/linux-mips64el": "0.17.18", "@esbuild/linux-ppc64": "0.17.18", "@esbuild/linux-riscv64": "0.17.18", "@esbuild/linux-s390x": "0.17.18", "@esbuild/linux-x64": "0.17.18", "@esbuild/netbsd-x64": "0.17.18", "@esbuild/openbsd-x64": "0.17.18", "@esbuild/sunos-x64": "0.17.18", "@esbuild/win32-arm64": "0.17.18", "@esbuild/win32-ia32": "0.17.18", "@esbuild/win32-x64": "0.17.18" } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.0", "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-antfu": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-0.35.3.tgz", "integrity": "sha512-90Xct24s2n3aQhuuFFcPLhF5E6lU5s225B0VXupSjvDTuF+CmSQQLQG6KcqcdpA8O6dMbeXB9zy3SJ4aO7lndw==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.53.0" } }, "node_modules/eslint-plugin-es": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" }, "engines": { "node": ">=8.10.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "node_modules/eslint-plugin-es/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/eslint-plugin-eslint-comments": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5", "ignore": "^5.0.5" }, "engines": { "node": ">=6.5.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/eslint-plugin-html": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-7.1.0.tgz", "integrity": "sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==", "dev": true, "dependencies": { "htmlparser2": "^8.0.1" } }, "node_modules/eslint-plugin-import": { "version": "2.27.5", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.7.4", "has": "^1.0.3", "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.values": "^1.1.6", "resolve": "^1.22.1", "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-jest": { "version": "27.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^5.0.0", "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true }, "jest": { "optional": true } } }, "node_modules/eslint-plugin-jsonc": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.7.0.tgz", "integrity": "sha512-DZgC71h/hZ9t5k/OGAKOMdJCleg2neZLL7No+YYi2ZMroCN4X5huZdrLf1USbrc6UTHwYujd1EDwXHg1qJ6CYw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "jsonc-eslint-parser": "^2.0.4", "natural-compare": "^1.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "node_modules/eslint-plugin-markdown": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "dependencies": { "mdast-util-from-markdown": "^0.8.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-n": { "version": "15.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", "is-core-module": "^2.11.0", "minimatch": "^3.1.2", "resolve": "^1.22.1", "semver": "^7.3.8" }, "engines": { "node": ">=12.22.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-no-only-tests": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, "engines": { "node": ">=5.0.0" } }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-unicorn": { "version": "45.0.2", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.19.1", "@eslint-community/eslint-utils": "^4.1.2", "ci-info": "^3.6.1", "clean-regexp": "^1.0.0", "esquery": "^1.4.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.0", "jsesc": "^3.0.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.24", "regjsparser": "^0.9.1", "safe-regex": "^2.1.1", "semver": "^7.3.8", "strip-indent": "^3.0.0" }, "engines": { "node": ">=14.18" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { "eslint": ">=8.28.0" } }, "node_modules/eslint-plugin-unused-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", "dev": true, "dependencies": { "eslint-rule-composer": "^0.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^5.0.0", "eslint": "^8.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true } } }, "node_modules/eslint-plugin-vue": { "version": "9.11.0", "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.11.0.tgz", "integrity": "sha512-bBCJAZnkBV7ATH4Z1E7CvN3nmtS4H7QUU3UBxPdo8WohRU+yHjnQRALpTbxMVcz0e4Mx3IyxIdP5HYODMxK9cQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.3.0", "natural-compare": "^1.4.0", "nth-check": "^2.0.1", "postcss-selector-parser": "^6.0.9", "semver": "^7.3.5", "vue-eslint-parser": "^9.0.1", "xml-name-validator": "^4.0.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-yml": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.5.0.tgz", "integrity": "sha512-iygN054g+ZrnYmtOXMnT+sx9iDNXt89/m0+506cQHeG0+5jJN8hY5iOPQLd3yfd50AfK/mSasajBWruf1SoHpQ==", "dev": true, "dependencies": { "debug": "^4.3.2", "lodash": "^4.17.21", "natural-compare": "^1.4.0", "yaml-eslint-parser": "^1.1.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "node_modules/eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, "engines": { "node": ">=4.0.0" } }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^2.0.0" }, "engines": { "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/espree": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/evtd": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz", "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==" }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], "engines": { "node": ">=4.0" }, "peerDependenciesMeta": { "debug": { "optional": true } } }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", "url": "https://www.patreon.com/infusion" } }, "node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=14.14" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/git-raw-commits": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "dependencies": { "dargs": "^7.0.0", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.js" }, "engines": { "node": ">=10" } }, "node_modules/glob": { "version": "9.3.5", "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "dependencies": { "ini": "^1.3.4" }, "engines": { "node": ">=4" } }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" } }, "node_modules/highlight.js": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", "engines": { "node": ">=12.0.0" } }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { "node": ">=10.17.0" } }, "node_modules/husky": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, "bin": { "husky": "lib/bin.js" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/typicode" } }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", "dev": true }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true, "bin": { "image-size": "bin/image-size.js" }, "engines": { "node": ">=0.10.0" } }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dev": true, "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-builtin-module": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "dependencies": { "builtin-modules": "^3.3.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dev": true, "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "dependencies": { "text-extensions": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, "bin": { "jake": "bin/cli.js" }, "engines": { "node": ">=10" } }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/jiti": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=6" } }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/jsonc-eslint-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.2.0.tgz", "integrity": "sha512-x5QjzBOORd+T2EjErIxJnkOEbLVEdD1ILEeBbIJt8Eq/zUn7P7M8qdnWiNVBK5f8oxnJpc6SBHOeeIEl/swPjg==", "dev": true, "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", "semver": "^7.3.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" } }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" ] }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "bin.js" }, "engines": { "node": "*" } }, "node_modules/katex": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.6.tgz", "integrity": "sha512-XVB7X8jEogjJ+OY+a9JdE+VOk9i7znela0HP6WaDbpB4sUh8ghrG0Ccluu2MA2tcJbFAViBC9aVXus2UvkEr8A==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", "tslib": "^2.3.0" }, "bin": { "lessc": "bin/lessc" }, "engines": { "node": ">=6" }, "optionalDependencies": { "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", "needle": "^3.1.0", "source-map": "~0.6.0" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "node_modules/linkify-it": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dependencies": { "uc.micro": "^1.0.1" } }, "node_modules/lint-staged": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "dependencies": { "chalk": "5.2.0", "cli-truncate": "^3.1.0", "commander": "^10.0.0", "debug": "^4.3.4", "execa": "^7.0.0", "lilconfig": "2.1.0", "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", "yaml": "^2.2.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { "node": "^14.13.1 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/lint-staged/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { "node": ">=14" } }, "node_modules/lint-staged/node_modules/execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" }, "engines": { "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/lint-staged/node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { "node": ">=14.18.0" } }, "node_modules/lint-staged/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/listr2": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "engines": { "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" }, "peerDependenciesMeta": { "enquirer": { "optional": true } } }, "node_modules/listr2/node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/listr2/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/listr2/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/listr2/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" }, "engines": { "node": ">=4" } }, "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "node_modules/lodash.mergewith": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "dev": true }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "node_modules/lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/log-update/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/magic-string": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { "node": ">=12" } }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "optional": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" }, "engines": { "node": ">=6" } }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true, "bin": { "semver": "bin/semver" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/markdown-it": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "node_modules/markdown-it-link-attributes": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-4.0.1.tgz", "integrity": "sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==", "dev": true }, "node_modules/markdown-it/node_modules/entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-string": "^2.0.0", "micromark": "~2.11.0", "parse-entities": "^2.0.0", "unist-util-stringify-position": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" } }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", "type-fest": "^0.18.0", "yargs-parser": "^20.2.3" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "debug": "^4.0.0", "parse-entities": "^2.0.0" } }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "optional": true, "bin": { "mime": "cli.js" }, "engines": { "node": ">=4" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", "kind-of": "^6.0.3" }, "engines": { "node": ">= 6" } }, "node_modules/minipass": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/muggle-string": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", "dev": true }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "node_modules/naive-ui": { "version": "2.34.3", "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.34.3.tgz", "integrity": "sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==", "dependencies": { "@css-render/plugin-bem": "^0.15.10", "@css-render/vue3-ssr": "^0.15.10", "@types/katex": "^0.14.0", "@types/lodash": "^4.14.181", "@types/lodash-es": "^4.17.6", "async-validator": "^4.0.7", "css-render": "^0.15.10", "date-fns": "^2.28.0", "date-fns-tz": "^1.3.3", "evtd": "^0.2.4", "highlight.js": "^11.5.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "seemly": "^0.3.6", "treemate": "^0.3.11", "vdirs": "^0.1.8", "vooks": "^0.2.12", "vueuc": "^0.4.47" }, "peerDependencies": { "vue": "^3.0.0" } }, "node_modules/naive-ui/node_modules/@types/katex": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "node_modules/needle": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", "dev": true, "optional": true, "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, "bin": { "needle": "bin/needle" }, "engines": { "node": ">= 4.4.x" } }, "node_modules/needle/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "optional": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, "engines": { "node": ">=10" } }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "bin": { "npm-run-all": "bin/npm-run-all/index.js", "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js" }, "engines": { "node": ">= 4" } }, "node_modules/npm-run-all/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/npm-run-all/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/npm-run-all/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/npm-run-all/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, "bin": { "pidtree": "bin/pidtree.js" }, "engines": { "node": ">=0.10" } }, "node_modules/npm-run-all/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/npm-run-all/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" }, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dev": true, "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, "engines": { "node": ">= 0.10" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-scurry": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", "dev": true, "dependencies": { "lru-cache": "^9.0.0", "minipass": "^5.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "bin": { "pidtree": "bin/pidtree.js" }, "engines": { "node": ">=0.10" } }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "optional": true, "engines": { "node": ">=6" } }, "node_modules/pinia": { "version": "2.0.35", "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.35.tgz", "integrity": "sha512-P1IKKQWhxGXiiZ3atOaNI75bYlFUbRxtJdhPLX059Z7+b9Z04rnTZdSY8Aph1LA+/4QEMAYHsTQ638Wfe+6K5g==", "dependencies": { "@vue/devtools-api": "^6.5.0", "vue-demi": "*" }, "funding": { "url": "https://github.com/sponsors/posva" }, "peerDependencies": { "@vue/composition-api": "^1.4.0", "typescript": ">=4.4.4", "vue": "^2.6.14 || ^3.2.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true }, "typescript": { "optional": true } } }, "node_modules/pinia/node_modules/vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "hasInstallScript": true, "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/postcss": { "version": "8.4.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-import": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-js": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, "engines": { "node": "^12 || ^14 || >= 16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { "postcss": "^8.4.21" } }, "node_modules/postcss-load-config": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "engines": { "node": ">= 10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "postcss": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/postcss-load-config/node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/postcss-nested": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": ">=12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/pretty-bytes": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz", "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==", "dev": true, "engines": { "node": "^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "optional": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true, "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "dependencies": { "pify": "^2.3.0" } }, "node_modules/read-cache/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/read-pkg-up": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" }, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp-tree": { "version": "0.1.25", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.25.tgz", "integrity": "sha512-szcL3aqw+vEeuxhL1AMYRyeMP+goYF5I/guaH10uJX5xbGyeQeNPPneaj3ZWVmGLCDxrVaaYekkr5R12gk4dJw==", "dev": true, "bin": { "regexp-tree": "bin/regexp-tree" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/resolve-global": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "dependencies": { "global-dirs": "^0.1.1" }, "engines": { "node": ">=8" } }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "dependencies": { "glob": "^9.2.0" }, "bin": { "rimraf": "dist/cjs/src/bin.js" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { "version": "3.20.7", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=14.18.0", "npm": ">=8.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "dependencies": { "regexp-tree": "~0.1.1" } }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "node_modules/seemly": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.6.tgz", "integrity": "sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==" }, "node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, "engines": { "node": ">=0.6.19" } }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.padend": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/stringify-object/node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "dependencies": { "min-indent": "^1.0.0" }, "engines": { "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/sucrase": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" }, "engines": { "node": ">=8" } }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tailwindcss": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", "dev": true, "dependencies": { "arg": "^5.0.2", "chokidar": "^3.5.3", "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.17.2", "lilconfig": "^2.0.6", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.0.9", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", "postcss-nested": "6.0.0", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1", "sucrase": "^3.29.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { "node": ">=12.13.0" }, "peerDependencies": { "postcss": "^8.0.9" } }, "node_modules/tailwindcss/node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/tempy": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, "engines": { "node": ">=0.10" } }, "node_modules/text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", "dependencies": { "utrie": "^1.0.2" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "dependencies": { "any-promise": "^1.0.0" } }, "node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, "engines": { "node": ">=0.8" } }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "dependencies": { "readable-stream": "3" } }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/treemate": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz", "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==" }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "@swc/wasm": { "optional": true } } }, "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "dependencies": { "crypto-random-string": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, "dependencies": { "@types/unist": "^2.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, "engines": { "node": ">= 10.0.0" } }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/utrie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/vdirs": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz", "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", "dependencies": { "evtd": "^0.2.2" }, "peerDependencies": { "vue": "^3.0.11" } }, "node_modules/vite": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", "dev": true, "dependencies": { "esbuild": "^0.17.5", "postcss": "^8.4.21", "rollup": "^3.20.2" }, "bin": { "vite": "bin/vite.js" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "less": { "optional": true }, "sass": { "optional": true }, "stylus": { "optional": true }, "sugarss": { "optional": true }, "terser": { "optional": true } } }, "node_modules/vite-plugin-pwa": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.14.7.tgz", "integrity": "sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==", "dev": true, "dependencies": { "@rollup/plugin-replace": "^5.0.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "pretty-bytes": "^6.0.0", "rollup": "^3.7.2", "workbox-build": "^6.5.4", "workbox-window": "^6.5.4" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "vite": "^3.1.0 || ^4.0.0", "workbox-build": "^6.5.4", "workbox-window": "^6.5.4" } }, "node_modules/vooks": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz", "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", "dependencies": { "evtd": "^0.2.2" }, "peerDependencies": { "vue": "^3.0.0" } }, "node_modules/vue": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", "dependencies": { "@vue/compiler-dom": "3.2.47", "@vue/compiler-sfc": "3.2.47", "@vue/runtime-dom": "3.2.47", "@vue/server-renderer": "3.2.47", "@vue/shared": "3.2.47" } }, "node_modules/vue-eslint-parser": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.1.tgz", "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", "dev": true, "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "engines": { "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/vue-i18n": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz", "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", "dependencies": { "@intlify/core-base": "9.2.2", "@intlify/shared": "9.2.2", "@intlify/vue-devtools": "9.2.2", "@vue/devtools-api": "^6.2.1" }, "engines": { "node": ">= 14" }, "peerDependencies": { "vue": "^3.0.0" } }, "node_modules/vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", "dependencies": { "@vue/devtools-api": "^6.4.5" }, "funding": { "url": "https://github.com/sponsors/posva" }, "peerDependencies": { "vue": "^3.2.0" } }, "node_modules/vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "node_modules/vue-tsc": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.4.4.tgz", "integrity": "sha512-2XsCjF2mLo6gwOVcOpngwJkP8GzYQjNh20A+Pr2FGdsWzr9jjXJ0k08/DfcslfncsuCrTrnWtb4KEL3gcDtlNA==", "dev": true, "dependencies": { "@volar/vue-language-core": "1.4.4", "@volar/vue-typescript": "1.4.4", "semver": "^7.3.8" }, "bin": { "vue-tsc": "bin/vue-tsc.js" }, "peerDependencies": { "typescript": "*" } }, "node_modules/vueuc": { "version": "0.4.51", "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.51.tgz", "integrity": "sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==", "dependencies": { "@css-render/vue3-ssr": "^0.15.10", "@juggle/resize-observer": "^3.3.1", "css-render": "^0.15.10", "evtd": "^0.2.4", "seemly": "^0.3.6", "vdirs": "^0.1.4", "vooks": "^0.2.4" }, "peerDependencies": { "vue": "^3.0.11" } }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-background-sync": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", "dev": true, "dependencies": { "idb": "^7.0.1", "workbox-core": "6.5.4" } }, "node_modules/workbox-broadcast-update": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-build": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", "dev": true, "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-node-resolve": "^11.2.1", "@rollup/plugin-replace": "^2.4.1", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", "glob": "^7.1.6", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", "workbox-background-sync": "6.5.4", "workbox-broadcast-update": "6.5.4", "workbox-cacheable-response": "6.5.4", "workbox-core": "6.5.4", "workbox-expiration": "6.5.4", "workbox-google-analytics": "6.5.4", "workbox-navigation-preload": "6.5.4", "workbox-precaching": "6.5.4", "workbox-range-requests": "6.5.4", "workbox-recipes": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4", "workbox-streams": "6.5.4", "workbox-sw": "6.5.4", "workbox-window": "6.5.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0" }, "peerDependenciesMeta": { "@types/babel__core": { "optional": true } } }, "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.19.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" } }, "node_modules/workbox-build/node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "engines": { "node": ">= 8.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/workbox-build/node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "node_modules/workbox-build/node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/workbox-build/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/workbox-build/node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/workbox-build/node_modules/rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=10.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/workbox-build/node_modules/rollup-plugin-terser": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", "terser": "^5.0.0" }, "peerDependencies": { "rollup": "^2.0.0" } }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, "dependencies": { "whatwg-url": "^7.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/workbox-cacheable-response": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-core": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", "dev": true }, "node_modules/workbox-expiration": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", "dev": true, "dependencies": { "idb": "^7.0.1", "workbox-core": "6.5.4" } }, "node_modules/workbox-google-analytics": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", "dev": true, "dependencies": { "workbox-background-sync": "6.5.4", "workbox-core": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "node_modules/workbox-navigation-preload": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-precaching": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", "dev": true, "dependencies": { "workbox-core": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "node_modules/workbox-range-requests": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-recipes": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", "dev": true, "dependencies": { "workbox-cacheable-response": "6.5.4", "workbox-core": "6.5.4", "workbox-expiration": "6.5.4", "workbox-precaching": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "node_modules/workbox-routing": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-strategies": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", "dev": true, "dependencies": { "workbox-core": "6.5.4" } }, "node_modules/workbox-streams": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", "dev": true, "dependencies": { "workbox-core": "6.5.4", "workbox-routing": "6.5.4" } }, "node_modules/workbox-sw": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", "dev": true }, "node_modules/workbox-window": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.5.4" } }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yaml": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/yaml-eslint-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.0.tgz", "integrity": "sha512-OmuvQd5lyIJWfFALc39K5fGqp0aWNc+EtyhVgcQIPZaUKMnTb7An3RMp+QJizJ/x0F4kpgTNe6BL/ctdvoIwIg==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", "yaml": "^2.0.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" } }, "node_modules/yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } } }, "dependencies": { "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@antfu/eslint-config": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-0.35.3.tgz", "integrity": "sha512-wd0ry/TNqaZmniqkKtZKoCvpl55x9YbHgL5Ug3H9rVuUSqaNi9G9AjYlynQqn4/M1EhYYWO597Lu7f/fC+csrg==", "dev": true, "requires": { "@antfu/eslint-config-vue": "0.35.3", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsonc": "^2.6.0", "eslint-plugin-n": "^15.6.1", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^45.0.2", "eslint-plugin-vue": "^9.9.0", "eslint-plugin-yml": "^1.5.0", "jsonc-eslint-parser": "^2.1.0", "yaml-eslint-parser": "^1.1.0" } }, "@antfu/eslint-config-basic": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-basic/-/eslint-config-basic-0.35.3.tgz", "integrity": "sha512-NbWJKNgd3Ky3/ok2Z88cXNme/6I9otkiaB+FYLFgQE81sfMAhKpLKXtTSwzdcKMzhKDqUchAijt0BxjE/mcTJg==", "dev": true, "requires": { "eslint-plugin-antfu": "0.35.3", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsonc": "^2.6.0", "eslint-plugin-markdown": "^3.0.0", "eslint-plugin-n": "^15.6.1", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^45.0.2", "eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-yml": "^1.5.0", "jsonc-eslint-parser": "^2.1.0", "yaml-eslint-parser": "^1.1.0" } }, "@antfu/eslint-config-ts": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-ts/-/eslint-config-ts-0.35.3.tgz", "integrity": "sha512-FS5hir2ghXYlJWAiB2bpT9oAr0kpSNmYbaJWWkztocJG95AORl4tWzxMTkLT+TxaOmhuwJszcrMTHy5RgHL8/w==", "dev": true, "requires": { "@antfu/eslint-config-basic": "0.35.3", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", "eslint-plugin-jest": "^27.2.1" } }, "@antfu/eslint-config-vue": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/@antfu/eslint-config-vue/-/eslint-config-vue-0.35.3.tgz", "integrity": "sha512-BA3vGLyuzqtEUb9gfgE7YzBT+a4oUnQuUPasIUfN/BVXaEhRVYlMmUgxN4ekQLuzOgUjUH13lqplXtkLJ62t9g==", "dev": true, "requires": { "@antfu/eslint-config-basic": "0.35.3", "@antfu/eslint-config-ts": "0.35.3", "eslint-plugin-vue": "^9.9.0", "local-pkg": "^0.4.3" } }, "@apideck/better-ajv-errors": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, "requires": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" } }, "@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true }, "@babel/core": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.21.4", "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.4", "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "requires": { "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true } } }, "@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "requires": { "@babel/compat-data": "^7.21.4", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "@babel/helper-create-class-features-plugin": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.3.1" } }, "@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "requires": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "requires": { "@babel/types": "^7.21.0" } }, "@babel/helper-module-imports": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "requires": { "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.2", "@babel/types": "^7.21.2" } }, "@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-string-parser": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true }, "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true }, "@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "requires": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" } }, "@babel/helpers": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "requires": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.21.0", "@babel/types": "^7.21.0" } }, "@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "@babel/parser": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.21.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.21.2", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { "version": "7.21.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", "dev": true, "requires": { "@babel/compat-data": "^7.21.4", "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.21.0", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.0", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.20.7", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", "@babel/plugin-transform-classes": "^7.21.0", "@babel/plugin-transform-computed-properties": "^7.20.7", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.21.0", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", "@babel/plugin-transform-modules-commonjs": "^7.21.2", "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.20.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.21.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true }, "@babel/runtime": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } }, "@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/traverse": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.21.4", "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, "@commitlint/cli": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.1.tgz", "integrity": "sha512-kCnDD9LE2ySiTnj/VPaxy4/oRayRcdv4aCuVxtoum8SxIU7OADHc0nJPQfheE8bHcs3zZdWzDMWltRosuT13bg==", "dev": true, "requires": { "@commitlint/format": "^17.4.4", "@commitlint/lint": "^17.6.1", "@commitlint/load": "^17.5.0", "@commitlint/read": "^17.5.1", "@commitlint/types": "^17.4.4", "execa": "^5.0.0", "lodash.isfunction": "^3.0.9", "resolve-from": "5.0.0", "resolve-global": "1.0.0", "yargs": "^17.0.0" } }, "@commitlint/config-conventional": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.1.tgz", "integrity": "sha512-ng/ybaSLuTCH9F+7uavSOnEQ9EFMl7lHEjfAEgRh1hwmEe8SpLKpQeMo2aT1IWvHaGMuTb+gjfbzoRf2IR23NQ==", "dev": true, "requires": { "conventional-changelog-conventionalcommits": "^5.0.0" } }, "@commitlint/config-validator": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", "ajv": "^8.11.0" } }, "@commitlint/ensure": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "lodash.startcase": "^4.4.0", "lodash.upperfirst": "^4.3.1" } }, "@commitlint/execute-rule": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true }, "@commitlint/format": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", "chalk": "^4.1.0" } }, "@commitlint/is-ignored": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz", "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", "semver": "7.3.8" } }, "@commitlint/lint": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.1.tgz", "integrity": "sha512-VARJ9kxH64isgwVnC+ABPafCYzqxpsWJIpDaTuI0gh8aX4GQ0i7cn9tvxtFNfJj4ER2BAJeWJ0vURdNYjK2RQQ==", "dev": true, "requires": { "@commitlint/is-ignored": "^17.4.4", "@commitlint/parse": "^17.4.4", "@commitlint/rules": "^17.6.1", "@commitlint/types": "^17.4.4" } }, "@commitlint/load": { "version": "17.5.0", "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", "dev": true, "requires": { "@commitlint/config-validator": "^17.4.4", "@commitlint/execute-rule": "^17.4.0", "@commitlint/resolve-extends": "^17.4.4", "@commitlint/types": "^17.4.4", "@types/node": "*", "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", "cosmiconfig-typescript-loader": "^4.0.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", "typescript": "^4.6.4 || ^5.0.0" } }, "@commitlint/message": { "version": "17.4.2", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true }, "@commitlint/parse": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", "conventional-changelog-angular": "^5.0.11", "conventional-commits-parser": "^3.2.2" } }, "@commitlint/read": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, "requires": { "@commitlint/top-level": "^17.4.0", "@commitlint/types": "^17.4.4", "fs-extra": "^11.0.0", "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" } }, "@commitlint/resolve-extends": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", "dev": true, "requires": { "@commitlint/config-validator": "^17.4.4", "@commitlint/types": "^17.4.4", "import-fresh": "^3.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" } }, "@commitlint/rules": { "version": "17.6.1", "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.1.tgz", "integrity": "sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==", "dev": true, "requires": { "@commitlint/ensure": "^17.4.4", "@commitlint/message": "^17.4.2", "@commitlint/to-lines": "^17.4.0", "@commitlint/types": "^17.4.4", "execa": "^5.0.0" } }, "@commitlint/to-lines": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", "dev": true }, "@commitlint/top-level": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", "dev": true, "requires": { "find-up": "^5.0.0" } }, "@commitlint/types": { "version": "17.4.4", "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, "requires": { "chalk": "^4.1.0" } }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, "dependencies": { "@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } } } }, "@css-render/plugin-bem": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.12.tgz", "integrity": "sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==", "requires": {} }, "@css-render/vue3-ssr": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.12.tgz", "integrity": "sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==", "requires": {} }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@esbuild/android-arm": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", "dev": true, "optional": true }, "@esbuild/android-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", "dev": true, "optional": true }, "@esbuild/android-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", "dev": true, "optional": true }, "@esbuild/linux-arm": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", "dev": true, "optional": true }, "@esbuild/linux-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", "dev": true, "optional": true }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" } }, "@eslint-community/regexpp": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true }, "@eslint/eslintrc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } }, "@eslint/js": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "dev": true }, "@iconify/vue": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.1.tgz", "integrity": "sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==", "dev": true, "requires": { "@iconify/types": "^2.0.0" } }, "@intlify/core-base": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", "requires": { "@intlify/devtools-if": "9.2.2", "@intlify/message-compiler": "9.2.2", "@intlify/shared": "9.2.2", "@intlify/vue-devtools": "9.2.2" } }, "@intlify/devtools-if": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", "requires": { "@intlify/shared": "9.2.2" } }, "@intlify/message-compiler": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", "requires": { "@intlify/shared": "9.2.2", "source-map": "0.6.1" } }, "@intlify/shared": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" }, "@intlify/vue-devtools": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", "requires": { "@intlify/core-base": "9.2.2", "@intlify/shared": "9.2.2" } }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/source-map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" }, "dependencies": { "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true } } }, "@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@rollup/plugin-replace": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", "dev": true, "requires": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.27.0" } }, "@rollup/pluginutils": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "requires": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^2.3.1" } }, "@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, "requires": { "ejs": "^3.1.6", "json5": "^2.2.0", "magic-string": "^0.25.0", "string.prototype.matchall": "^4.0.6" }, "dependencies": { "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "requires": { "sourcemap-codec": "^1.4.8" } } } }, "@traptitech/markdown-it-katex": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@traptitech/markdown-it-katex/-/markdown-it-katex-3.6.0.tgz", "integrity": "sha512-CnJzTWxsgLGXFdSrWRaGz7GZ1kUUi8g3E9HzJmeveX1YwVJavrKYqysktfHZQsujdnRqV5O7g8FPKEA/aeTkOQ==", "requires": { "katex": "^0.16.0" } }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, "@types/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", "dev": true }, "@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/katex": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==", "dev": true }, "@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, "@types/lodash": { "version": "4.14.194", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "@types/lodash-es": { "version": "4.17.7", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "requires": { "@types/lodash": "*" } }, "@types/markdown-it": { "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dev": true, "requires": { "@types/linkify-it": "*", "@types/mdurl": "*" } }, "@types/markdown-it-link-attributes": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.1.tgz", "integrity": "sha512-K8RnNb1q8j7rDOJbMF7AnlhCC/45BjrQ8z3WZWOrvkBIl8u9RXvmBdG/hfpnmK1JhhEZcmFEKWt+ilW1Mly+2Q==", "dev": true, "requires": { "@types/markdown-it": "*" } }, "@types/mdast": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", "dev": true, "requires": { "@types/unist": "*" } }, "@types/mdurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "@types/node": { "version": "18.16.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, "@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, "@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" }, "@typescript-eslint/eslint-plugin": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/type-utils": "5.59.0", "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/parser": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/types": "5.59.0", "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.0", "@typescript-eslint/visitor-keys": "5.59.0" } }, "@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "requires": { "@typescript-eslint/typescript-estree": "5.59.0", "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.0", "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.59.0", "@typescript-eslint/types": "5.59.0", "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" } }, "@vitejs/plugin-vue": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz", "integrity": "sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==", "dev": true, "requires": {} }, "@volar/language-core": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", "dev": true, "requires": { "@volar/source-map": "1.4.1" } }, "@volar/source-map": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.1.tgz", "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", "dev": true, "requires": { "muggle-string": "^0.2.2" } }, "@volar/typescript": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.4.1.tgz", "integrity": "sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==", "dev": true, "requires": { "@volar/language-core": "1.4.1" } }, "@volar/vue-language-core": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.4.4.tgz", "integrity": "sha512-c3hL6un+CfoOlusGvpypcodmk9ke/ImrWIUc0GkgI+imoQpUGzgu3tEQWlPs604R7AhxeZwWUi8hQNfax0R/zA==", "dev": true, "requires": { "@volar/language-core": "1.4.1", "@volar/source-map": "1.4.1", "@vue/compiler-dom": "^3.2.0", "@vue/compiler-sfc": "^3.2.0", "@vue/reactivity": "^3.2.0", "@vue/shared": "^3.2.0", "minimatch": "^9.0.0", "muggle-string": "^0.2.2", "vue-template-compiler": "^2.7.14" }, "dependencies": { "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "minimatch": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } } } }, "@volar/vue-typescript": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.4.4.tgz", "integrity": "sha512-L61Fk15jlJw3QtIddD4cVE5jei5i6zbLJRiaEMYDDnUKB259/qUrdvnMfnZUFVyDwlevzdstjtaUyreeG/0nPQ==", "dev": true, "requires": { "@volar/typescript": "1.4.1", "@volar/vue-language-core": "1.4.4" } }, "@vue/compiler-core": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", "requires": { "@babel/parser": "^7.16.4", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", "requires": { "@vue/compiler-core": "3.2.47", "@vue/shared": "3.2.47" } }, "@vue/compiler-sfc": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", "requires": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", "@vue/compiler-dom": "3.2.47", "@vue/compiler-ssr": "3.2.47", "@vue/reactivity-transform": "3.2.47", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" }, "dependencies": { "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "requires": { "sourcemap-codec": "^1.4.8" } } } }, "@vue/compiler-ssr": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", "requires": { "@vue/compiler-dom": "3.2.47", "@vue/shared": "3.2.47" } }, "@vue/devtools-api": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "@vue/reactivity": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", "requires": { "@vue/shared": "3.2.47" } }, "@vue/reactivity-transform": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", "requires": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.47", "@vue/shared": "3.2.47", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, "dependencies": { "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "requires": { "sourcemap-codec": "^1.4.8" } } } }, "@vue/runtime-core": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", "requires": { "@vue/reactivity": "3.2.47", "@vue/shared": "3.2.47" } }, "@vue/runtime-dom": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", "requires": { "@vue/runtime-core": "3.2.47", "@vue/shared": "3.2.47", "csstype": "^2.6.8" }, "dependencies": { "csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" } } }, "@vue/server-renderer": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", "requires": { "@vue/compiler-ssr": "3.2.47", "@vue/shared": "3.2.47" } }, "@vue/shared": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, "@vueuse/core": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "requires": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", "@vueuse/shared": "9.13.0", "vue-demi": "*" }, "dependencies": { "vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "requires": {} } } }, "@vueuse/metadata": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" }, "@vueuse/shared": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "requires": { "vue-demi": "*" }, "dependencies": { "vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "requires": {} } } }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "requires": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" } }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, "array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, "autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "requires": { "browserslist": "^4.21.5", "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" } }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, "axios": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz", "integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==", "dev": true, "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, "browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" } }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "requires": { "semver": "^7.0.0" } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" } }, "caniuse-lite": { "version": "1.0.30001481", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "dev": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "dev": true }, "character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "dependencies": { "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } } } }, "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" }, "dependencies": { "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { "restore-cursor": "^3.1.0" } }, "cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" } }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } } } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "requires": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "conventional-changelog-angular": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", "q": "^1.5.1" } }, "conventional-changelog-conventionalcommits": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", "dev": true, "requires": { "compare-func": "^2.0.0", "lodash": "^4.17.15", "q": "^1.5.1" } }, "conventional-commits-parser": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "requires": { "is-text-path": "^1.0.1", "JSONStream": "^1.0.4", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" } }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "requires": { "is-what": "^3.14.1" } }, "core-js-compat": { "version": "3.30.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", "dev": true, "requires": { "browserslist": "^4.21.5" } }, "cosmiconfig": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "requires": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" } }, "cosmiconfig-typescript-loader": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", "dev": true, "requires": {} }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", "dev": true }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, "css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", "requires": { "utrie": "^1.0.2" } }, "css-render": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.12.tgz", "integrity": "sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==", "requires": { "@emotion/hash": "~0.8.0", "csstype": "~3.0.5" } }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, "csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true }, "date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, "date-fns-tz": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", "requires": {} }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decamelize-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, "dependencies": { "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true } } }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { "path-type": "^4.0.0" } }, "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { "domelementtype": "^2.3.0" } }, "domutils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.1" } }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" } }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "requires": { "jake": "^10.8.5" } }, "electron-to-chromium": { "version": "1.4.369", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.369.tgz", "integrity": "sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==", "dev": true }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "optional": true, "requires": { "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" } }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, "requires": { "has": "^1.0.3" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "esbuild": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", "dev": true, "requires": { "@esbuild/android-arm": "0.17.18", "@esbuild/android-arm64": "0.17.18", "@esbuild/android-x64": "0.17.18", "@esbuild/darwin-arm64": "0.17.18", "@esbuild/darwin-x64": "0.17.18", "@esbuild/freebsd-arm64": "0.17.18", "@esbuild/freebsd-x64": "0.17.18", "@esbuild/linux-arm": "0.17.18", "@esbuild/linux-arm64": "0.17.18", "@esbuild/linux-ia32": "0.17.18", "@esbuild/linux-loong64": "0.17.18", "@esbuild/linux-mips64el": "0.17.18", "@esbuild/linux-ppc64": "0.17.18", "@esbuild/linux-riscv64": "0.17.18", "@esbuild/linux-s390x": "0.17.18", "@esbuild/linux-x64": "0.17.18", "@esbuild/netbsd-x64": "0.17.18", "@esbuild/openbsd-x64": "0.17.18", "@esbuild/sunos-x64": "0.17.18", "@esbuild/win32-arm64": "0.17.18", "@esbuild/win32-ia32": "0.17.18", "@esbuild/win32-x64": "0.17.18" } }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.0", "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } }, "eslint-import-resolver-node": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", "is-core-module": "^2.11.0", "resolve": "^1.22.1" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-plugin-antfu": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-0.35.3.tgz", "integrity": "sha512-90Xct24s2n3aQhuuFFcPLhF5E6lU5s225B0VXupSjvDTuF+CmSQQLQG6KcqcdpA8O6dMbeXB9zy3SJ4aO7lndw==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.53.0" } }, "eslint-plugin-es": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "requires": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" }, "dependencies": { "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-plugin-eslint-comments": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", "ignore": "^5.0.5" }, "dependencies": { "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } }, "eslint-plugin-html": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-7.1.0.tgz", "integrity": "sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==", "dev": true, "requires": { "htmlparser2": "^8.0.1" } }, "eslint-plugin-import": { "version": "2.27.5", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.7.4", "has": "^1.0.3", "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.values": "^1.1.6", "resolve": "^1.22.1", "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "eslint-plugin-jest": { "version": "27.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" } }, "eslint-plugin-jsonc": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.7.0.tgz", "integrity": "sha512-DZgC71h/hZ9t5k/OGAKOMdJCleg2neZLL7No+YYi2ZMroCN4X5huZdrLf1USbrc6UTHwYujd1EDwXHg1qJ6CYw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "jsonc-eslint-parser": "^2.0.4", "natural-compare": "^1.4.0" } }, "eslint-plugin-markdown": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "requires": { "mdast-util-from-markdown": "^0.8.5" } }, "eslint-plugin-n": { "version": "15.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "requires": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", "is-core-module": "^2.11.0", "minimatch": "^3.1.2", "resolve": "^1.22.1", "semver": "^7.3.8" } }, "eslint-plugin-no-only-tests": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true }, "eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "requires": {} }, "eslint-plugin-unicorn": { "version": "45.0.2", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.19.1", "@eslint-community/eslint-utils": "^4.1.2", "ci-info": "^3.6.1", "clean-regexp": "^1.0.0", "esquery": "^1.4.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.0", "jsesc": "^3.0.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.24", "regjsparser": "^0.9.1", "safe-regex": "^2.1.1", "semver": "^7.3.8", "strip-indent": "^3.0.0" } }, "eslint-plugin-unused-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", "dev": true, "requires": { "eslint-rule-composer": "^0.3.0" } }, "eslint-plugin-vue": { "version": "9.11.0", "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.11.0.tgz", "integrity": "sha512-bBCJAZnkBV7ATH4Z1E7CvN3nmtS4H7QUU3UBxPdo8WohRU+yHjnQRALpTbxMVcz0e4Mx3IyxIdP5HYODMxK9cQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.3.0", "natural-compare": "^1.4.0", "nth-check": "^2.0.1", "postcss-selector-parser": "^6.0.9", "semver": "^7.3.5", "vue-eslint-parser": "^9.0.1", "xml-name-validator": "^4.0.0" } }, "eslint-plugin-yml": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.5.0.tgz", "integrity": "sha512-iygN054g+ZrnYmtOXMnT+sx9iDNXt89/m0+506cQHeG0+5jJN8hY5iOPQLd3yfd50AfK/mSasajBWruf1SoHpQ==", "dev": true, "requires": { "debug": "^4.3.2", "lodash": "^4.17.21", "natural-compare": "^1.4.0", "yaml-eslint-parser": "^1.1.0" } }, "eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "eslint-visitor-keys": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.0" } }, "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "evtd": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz", "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==" }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "dependencies": { "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } } } }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" } }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "requires": { "minimatch": "^5.0.1" }, "dependencies": { "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } } } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" }, "dependencies": { "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } } } }, "flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, "fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" } }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" } }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "git-raw-commits": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "requires": { "dargs": "^7.0.0", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" } }, "glob": { "version": "9.3.5", "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" }, "dependencies": { "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "minimatch": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } } } }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { "is-glob": "^4.0.3" } }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "requires": { "ini": "^1.3.4" } }, "globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "requires": { "define-properties": "^1.1.3" } }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { "get-intrinsic": "^1.1.3" } }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "highlight.js": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==" }, "hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", "requires": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "husky": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", "dev": true }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "dependencies": { "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-builtin-module": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "requires": { "builtin-modules": "^3.3.0" } }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "requires": { "text-extensions": "^1.0.0" } }, "is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" } }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, "jiti": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "dev": true }, "js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" } }, "jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" } }, "jsonc-eslint-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.2.0.tgz", "integrity": "sha512-x5QjzBOORd+T2EjErIxJnkOEbLVEdD1ILEeBbIJt8Eq/zUn7P7M8qdnWiNVBK5f8oxnJpc6SBHOeeIEl/swPjg==", "dev": true, "requires": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", "semver": "^7.3.5" } }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" } }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } }, "katex": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.6.tgz", "integrity": "sha512-XVB7X8jEogjJ+OY+a9JdE+VOk9i7znela0HP6WaDbpB4sUh8ghrG0Ccluu2MA2tcJbFAViBC9aVXus2UvkEr8A==", "requires": { "commander": "^8.3.0" } }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "requires": { "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", "needle": "^3.1.0", "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^2.3.0" } }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "linkify-it": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "requires": { "uc.micro": "^1.0.1" } }, "lint-staged": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "requires": { "chalk": "5.2.0", "cli-truncate": "^3.1.0", "commander": "^10.0.0", "debug": "^4.3.4", "execa": "^7.0.0", "lilconfig": "2.1.0", "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", "yaml": "^2.2.1" }, "dependencies": { "chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true }, "commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true }, "is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { "path-key": "^4.0.0" } }, "onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { "mimic-fn": "^4.0.0" } }, "path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true } } }, "listr2": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "requires": { "cli-truncate": "^2.1.0", "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "dependencies": { "cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } } } }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true } } }, "local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { "p-locate": "^5.0.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.mergewith": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, "lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "dev": true }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true }, "log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } } } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "magic-string": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "optional": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true } } }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, "markdown-it": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", "requires": { "argparse": "^2.0.1", "entities": "~3.0.1", "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" } } }, "markdown-it-link-attributes": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-4.0.1.tgz", "integrity": "sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==", "dev": true }, "mdast-util-from-markdown": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-string": "^2.0.0", "micromark": "~2.11.0", "parse-entities": "^2.0.0", "unist-util-stringify-position": "^2.0.0" } }, "mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", "dev": true }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true }, "meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", "type-fest": "^0.18.0", "yargs-parser": "^20.2.3" }, "dependencies": { "type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true } } }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", "dev": true, "requires": { "debug": "^4.0.0", "parse-entities": "^2.0.0" } }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "optional": true }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { "mime-db": "1.52.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", "kind-of": "^6.0.3" } }, "minipass": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "muggle-string": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", "dev": true }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "naive-ui": { "version": "2.34.3", "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.34.3.tgz", "integrity": "sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==", "requires": { "@css-render/plugin-bem": "^0.15.10", "@css-render/vue3-ssr": "^0.15.10", "@types/katex": "^0.14.0", "@types/lodash": "^4.14.181", "@types/lodash-es": "^4.17.6", "async-validator": "^4.0.7", "css-render": "^0.15.10", "date-fns": "^2.28.0", "date-fns-tz": "^1.3.3", "evtd": "^0.2.4", "highlight.js": "^11.5.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "seemly": "^0.3.6", "treemate": "^0.3.11", "vdirs": "^0.1.8", "vooks": "^0.2.12", "vueuc": "^0.4.47" }, "dependencies": { "@types/katex": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" } } }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "needle": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", "dev": true, "optional": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "optional": true, "requires": { "ms": "^2.1.1" } } } }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" } }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" } }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" } }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { "p-limit": "^3.0.2" } }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" } }, "parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dev": true, "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-scurry": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", "dev": true, "requires": { "lru-cache": "^9.0.0", "minipass": "^5.0.0" }, "dependencies": { "lru-cache": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true }, "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true } } }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "optional": true }, "pinia": { "version": "2.0.35", "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.35.tgz", "integrity": "sha512-P1IKKQWhxGXiiZ3atOaNI75bYlFUbRxtJdhPLX059Z7+b9Z04rnTZdSY8Aph1LA+/4QEMAYHsTQ638Wfe+6K5g==", "requires": { "@vue/devtools-api": "^6.5.0", "vue-demi": "*" }, "dependencies": { "vue-demi": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", "requires": {} } } }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, "postcss": { "version": "8.4.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "requires": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "postcss-import": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" } }, "postcss-js": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "requires": { "camelcase-css": "^2.0.1" } }, "postcss-load-config": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "requires": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "dependencies": { "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true } } }, "postcss-nested": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.10" } }, "postcss-selector-parser": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "pretty-bytes": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz", "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==", "dev": true }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "optional": true }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "requires": { "pify": "^2.3.0" }, "dependencies": { "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" }, "dependencies": { "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" } }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "read-pkg-up": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" }, "dependencies": { "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, "regexp-tree": { "version": "0.1.25", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.25.tgz", "integrity": "sha512-szcL3aqw+vEeuxhL1AMYRyeMP+goYF5I/guaH10uJX5xbGyeQeNPPneaj3ZWVmGLCDxrVaaYekkr5R12gk4dJw==", "dev": true }, "regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "functions-have-names": "^1.2.3" } }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "requires": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-global": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "requires": { "global-dirs": "^0.1.1" } }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "requires": { "glob": "^9.2.0" } }, "rollup": { "version": "3.20.7", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", "dev": true, "requires": { "fsevents": "~2.3.2" } }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { "queue-microtask": "^1.2.2" } }, "rxjs": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "requires": { "regexp-tree": "~0.1.1" } }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "seemly": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.6.tgz", "integrity": "sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==" }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" } }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true } } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { "readable-stream": "^3.0.0" } }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { "safe-buffer": "~5.2.0" } }, "string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "dependencies": { "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { "ansi-regex": "^6.0.1" } } } }, "string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, "string.prototype.padend": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" }, "dependencies": { "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true } } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { "min-indent": "^1.0.0" } }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "sucrase": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "dependencies": { "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "tailwindcss": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", "dev": true, "requires": { "arg": "^5.0.2", "chokidar": "^3.5.3", "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.17.2", "lilconfig": "^2.0.6", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.0.9", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", "postcss-nested": "6.0.0", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1", "sucrase": "^3.29.0" }, "dependencies": { "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true } } }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true }, "tempy": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, "requires": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" }, "dependencies": { "type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true } } }, "terser": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true } } }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, "text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", "requires": { "utrie": "^1.0.2" } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "requires": { "any-promise": "^1.0.0" } }, "thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" } }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "treemate": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz", "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==" }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "dependencies": { "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true } } }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" }, "dependencies": { "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" } }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" } }, "typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { "crypto-random-string": "^2.0.0" } }, "unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, "requires": { "@types/unist": "^2.0.2" } }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "utrie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", "requires": { "base64-arraybuffer": "^1.0.2" } }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vdirs": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz", "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", "requires": { "evtd": "^0.2.2" } }, "vite": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", "dev": true, "requires": { "esbuild": "^0.17.5", "fsevents": "~2.3.2", "postcss": "^8.4.21", "rollup": "^3.20.2" } }, "vite-plugin-pwa": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.14.7.tgz", "integrity": "sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==", "dev": true, "requires": { "@rollup/plugin-replace": "^5.0.1", "debug": "^4.3.4", "fast-glob": "^3.2.12", "pretty-bytes": "^6.0.0", "rollup": "^3.7.2", "workbox-build": "^6.5.4", "workbox-window": "^6.5.4" } }, "vooks": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz", "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", "requires": { "evtd": "^0.2.2" } }, "vue": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", "requires": { "@vue/compiler-dom": "3.2.47", "@vue/compiler-sfc": "3.2.47", "@vue/runtime-dom": "3.2.47", "@vue/server-renderer": "3.2.47", "@vue/shared": "3.2.47" } }, "vue-eslint-parser": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.1.tgz", "integrity": "sha512-C2aI/r85Q6tYcz4dpgvrs4wH/MqVrRAVIdpYedrxnATDHHkb+TroeRcDpKWGZCx/OcECMWfz7tVwQ8e+Opy6rA==", "dev": true, "requires": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "dependencies": { "eslint-scope": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "vue-i18n": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz", "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", "requires": { "@intlify/core-base": "9.2.2", "@intlify/shared": "9.2.2", "@intlify/vue-devtools": "9.2.2", "@vue/devtools-api": "^6.2.1" } }, "vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", "requires": { "@vue/devtools-api": "^6.4.5" } }, "vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "requires": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "vue-tsc": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.4.4.tgz", "integrity": "sha512-2XsCjF2mLo6gwOVcOpngwJkP8GzYQjNh20A+Pr2FGdsWzr9jjXJ0k08/DfcslfncsuCrTrnWtb4KEL3gcDtlNA==", "dev": true, "requires": { "@volar/vue-language-core": "1.4.4", "@volar/vue-typescript": "1.4.4", "semver": "^7.3.8" } }, "vueuc": { "version": "0.4.51", "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.51.tgz", "integrity": "sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==", "requires": { "@css-render/vue3-ssr": "^0.15.10", "@juggle/resize-observer": "^3.3.1", "css-render": "^0.15.10", "evtd": "^0.2.4", "seemly": "^0.3.6", "vdirs": "^0.1.4", "vooks": "^0.2.4" } }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" } }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "workbox-background-sync": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", "dev": true, "requires": { "idb": "^7.0.1", "workbox-core": "6.5.4" } }, "workbox-broadcast-update": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-build": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", "dev": true, "requires": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-node-resolve": "^11.2.1", "@rollup/plugin-replace": "^2.4.1", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", "glob": "^7.1.6", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", "workbox-background-sync": "6.5.4", "workbox-broadcast-update": "6.5.4", "workbox-cacheable-response": "6.5.4", "workbox-core": "6.5.4", "workbox-expiration": "6.5.4", "workbox-google-analytics": "6.5.4", "workbox-navigation-preload": "6.5.4", "workbox-precaching": "6.5.4", "workbox-range-requests": "6.5.4", "workbox-recipes": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4", "workbox-streams": "6.5.4", "workbox-sw": "6.5.4", "workbox-window": "6.5.4" }, "dependencies": { "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" } }, "@rollup/plugin-node-resolve": { "version": "11.2.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.19.0" } }, "@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" } }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" } }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "requires": { "sourcemap-codec": "^1.4.8" } }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, "rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { "fsevents": "~2.3.2" } }, "rollup-plugin-terser": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", "terser": "^5.0.0" } }, "source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, "requires": { "whatwg-url": "^7.0.0" } } } }, "workbox-cacheable-response": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-core": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", "dev": true }, "workbox-expiration": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", "dev": true, "requires": { "idb": "^7.0.1", "workbox-core": "6.5.4" } }, "workbox-google-analytics": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", "dev": true, "requires": { "workbox-background-sync": "6.5.4", "workbox-core": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "workbox-navigation-preload": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-precaching": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", "dev": true, "requires": { "workbox-core": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "workbox-range-requests": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-recipes": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", "dev": true, "requires": { "workbox-cacheable-response": "6.5.4", "workbox-core": "6.5.4", "workbox-expiration": "6.5.4", "workbox-precaching": "6.5.4", "workbox-routing": "6.5.4", "workbox-strategies": "6.5.4" } }, "workbox-routing": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-strategies": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", "dev": true, "requires": { "workbox-core": "6.5.4" } }, "workbox-streams": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", "dev": true, "requires": { "workbox-core": "6.5.4", "workbox-routing": "6.5.4" } }, "workbox-sw": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", "dev": true }, "workbox-window": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", "dev": true, "requires": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.5.4" } }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", "dev": true }, "yaml-eslint-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.0.tgz", "integrity": "sha512-OmuvQd5lyIJWfFALc39K5fGqp0aWNc+EtyhVgcQIPZaUKMnTb7An3RMp+QJizJ/x0F4kpgTNe6BL/ctdvoIwIg==", "dev": true, "requires": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", "yaml": "^2.0.0" } }, "yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } } ================================================ FILE: CHANGELOG.md ================================================ ## v2.11.1 `2023-10-11` ## Enhancement - 优化打字机光标效果 - 清空聊天历史按钮 - 更新文档 ## BugFix - 修复移动端上的问题 - 修复不规范的引入导致的问题 ## v2.11.0 `2023-04-26` > [chatgpt-web-plus](https://github.com/Chanzhaoyu/chatgpt-web-plus) 新界面、完整用户管理 ## Enhancement - 更新默认 `accessToken` 反代地址为 [[pengzhile](https://github.com/pengzhile)] 的 `https://ai.fakeopen.com/api/conversation` [[24min](https://github.com/Chanzhaoyu/chatgpt-web/pull/1567/files)] - 添加自定义 `temperature` 和 `top_p` [[quzard](https://github.com/Chanzhaoyu/chatgpt-web/pull/1260)] - 优化代码 [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/1328)] - 优化复制代码反馈效果 ## BugFix - 修复余额查询和文案 [[luckywangxi](https://github.com/Chanzhaoyu/chatgpt-web/pull/1174)][[zuoning777](https://github.com/Chanzhaoyu/chatgpt-web/pull/1296)] - 修复默认语言错误 [[idawnwon](https://github.com/Chanzhaoyu/chatgpt-web/pull/1352)] - 修复 `onRegenerate` 下问题 [[leafsummer](https://github.com/Chanzhaoyu/chatgpt-web/pull/1188)] ## Other - 引导用户触发提示词 [[RyanXinOne](https://github.com/Chanzhaoyu/chatgpt-web/pull/1183)] - 添加韩语翻译 [[Kamilake](https://github.com/Chanzhaoyu/chatgpt-web/pull/1372)] - 添加俄语翻译 [[aquaratixc](https://github.com/Chanzhaoyu/chatgpt-web/pull/1571)] - 优化翻译和文本检查 [[PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/1460)] - 移除无用文件 ## v2.10.9 `2023-04-03` > 更新默认 `accessToken` 反代地址为 [[pengzhile](https://github.com/pengzhile)] 的 `https://ai.fakeopen.com/api/conversation` ## Enhancement - 添加 `socks5` 代理认证 [[yimiaoxiehou](https://github.com/Chanzhaoyu/chatgpt-web/pull/999)] - 添加 `socks` 代理用户名密码的配置 [[hank-cp](https://github.com/Chanzhaoyu/chatgpt-web/pull/890)] - 添加可选日志打印 [[zcong1993](https://github.com/Chanzhaoyu/chatgpt-web/pull/1041)] - 更新侧边栏按钮本地化[[simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/911)] - 优化代码块滚动条高度 [[Fog3211](https://github.com/Chanzhaoyu/chatgpt-web/pull/1153)] ## BugFix - 修复 `PWA` 问题 [[bingo235](https://github.com/Chanzhaoyu/chatgpt-web/pull/807)] - 修复 `ESM` 错误 [[kidonng](https://github.com/Chanzhaoyu/chatgpt-web/pull/826)] - 修复反向代理开启时限流失效的问题 [[gitgitgogogo](https://github.com/Chanzhaoyu/chatgpt-web/pull/863)] - 修复 `docker` 构建时 `.env` 可能被忽略的问题 [[zaiMoe](https://github.com/Chanzhaoyu/chatgpt-web/pull/877)] - 修复导出异常错误 [[KingTwinkle](https://github.com/Chanzhaoyu/chatgpt-web/pull/938)] - 修复空值异常 [[vchenpeng](https://github.com/Chanzhaoyu/chatgpt-web/pull/1103)] - 移动端上的体验问题 ## Other - `Docker` 容器名字名义 [[LOVECHEN](https://github.com/Chanzhaoyu/chatgpt-web/pull/1035)] - `kubernetes` 部署配置 [[CaoYunzhou](https://github.com/Chanzhaoyu/chatgpt-web/pull/1001)] - 感谢 [[assassinliujie](https://github.com/Chanzhaoyu/chatgpt-web/pull/962)] 和 [[puppywang](https://github.com/Chanzhaoyu/chatgpt-web/pull/1017)] 的某些贡献 - 更新 `kubernetes/deploy.yaml` [[idawnwon](https://github.com/Chanzhaoyu/chatgpt-web/pull/1085)] - 文档更新 [[#yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/883)] - 文档更新 [[weifeng12x](https://github.com/Chanzhaoyu/chatgpt-web/pull/880)] - 依赖更新 ## v2.10.8 `2023-03-23` 如遇问题,请删除 `node_modules` 重新安装依赖。 ## Feature - 显示回复消息原文的选项 [[yilozt](https://github.com/Chanzhaoyu/chatgpt-web/pull/672)] - 添加单 `IP` 每小时请求限制。环境变量: `MAX_REQUEST_PER_HOUR` [[zhuxindong ](https://github.com/Chanzhaoyu/chatgpt-web/pull/718)] - 前端添加角色设定,仅 `API` 方式可见 [[quzard](https://github.com/Chanzhaoyu/chatgpt-web/pull/768)] - `OPENAI_API_MODEL` 变量现在对 `ChatGPTUnofficialProxyAPI` 也生效,注意:`Token` 和 `API` 的模型命名不一致,不能直接填入 `gpt-3.5` 或者 `gpt-4` [[hncboy](https://github.com/Chanzhaoyu/chatgpt-web/pull/632)] - 添加繁体中文 `Prompts` [[PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/796)] ## Enhancement - 重置回答时滚动定位至该回答 [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/781)] - 当 `API` 是 `gpt-4` 时增加可用的 `Max Tokens` [[simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/729)] - 判断和忽略回复字符 [[liut](https://github.com/Chanzhaoyu/chatgpt-web/pull/474)] - 切换会话时,自动聚焦输入框 [[JS-an](https://github.com/Chanzhaoyu/chatgpt-web/pull/735)] - 渲染的链接新窗口打开 - 查询余额可选 `API_BASE_URL` 代理地址 - `config` 接口添加验证防止被无限制调用 - `PWA` 默认不开启,现在需手动修改 `.env` 文件 `VITE_GLOB_APP_PWA` 变量 - 当网络连接时,刷新页面,`500` 错误页自动跳转到主页 ## BugFix - `scrollToBottom` 调回 `scrollToBottomIfAtBottom` [[shunyue1320](https://github.com/Chanzhaoyu/chatgpt-web/pull/771)] - 重置异常的 `loading` 会话 ## Common - 创建 `start.cmd` 在 `windows` 下也可以运行 [vulgatecnn](https://github.com/Chanzhaoyu/chatgpt-web/pull/656)] - 添加 `visual-studio-code` 中调试配置 [[ChandlerVer5](https://github.com/Chanzhaoyu/chatgpt-web/pull/296)] - 修复文档中 `docker` 端口为本地 [[kilvn](https://github.com/Chanzhaoyu/chatgpt-web/pull/802)] ## Other - 依赖更新 ## v2.10.7 `2023-03-17` ## BugFix - 回退 `chatgpt` 版本,原因:导致 `OPENAI_API_BASE_URL` 代理失效 - 修复缺省状态的 `usingContext` 默认值 ## v2.10.6 `2023-03-17` ## Feature - 显示 `API` 余额 [[pzcn](https://github.com/Chanzhaoyu/chatgpt-web/pull/582)] ## Enhancement - 美化滚动条样式和 `UI` 保持一致 [[haydenull](https://github.com/Chanzhaoyu/chatgpt-web/pull/617)] - 优化移动端 `Prompt` 样式 [[CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/608)] - 上下文开关改为全局开关,现在记录在本地缓存中 - 配置信息按接口类型显示 ## Perf - 优化函数方法 [[kirklin](https://github.com/Chanzhaoyu/chatgpt-web/pull/583)] - 字符错误 [[pdsuwwz](https://github.com/Chanzhaoyu/chatgpt-web/pull/585)] - 文档描述错误 [[lizhongyuan3](https://github.com/Chanzhaoyu/chatgpt-web/pull/636)] ## BugFix - 修复 `Prompt` 导入、导出兼容性错误 - 修复 `highlight.js` 控制台兼容性警告 ## Other - 依赖更新 ## v2.10.5 `2023-03-13` 更新依赖,`access_token` 默认代理为 [pengzhile](https://github.com/pengzhile) 的 `https://bypass.duti.tech/api/conversation` ## Feature - `Prompt` 商店在线导入可以导入两种 `recommend.json`里提到的模板 [simonwu53](https://github.com/Chanzhaoyu/chatgpt-web/pull/521) - 支持 `HTTPS_PROXY` [whatwewant](https://github.com/Chanzhaoyu/chatgpt-web/pull/308) - `Prompt` 添加查询筛选 ## Enhancement - 调整输入框最大行数 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/502) - 优化 `docker` 打包 [whatwewant](https://github.com/Chanzhaoyu/chatgpt-web/pull/520) - `Prompt` 添加翻译和优化布局 - 「繁体中文」补全和审阅 [PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/542) - 语言选择调整为下路框形式 - 权限输入框类型调整为密码形式 ## BugFix - `JSON` 导入检查 [Nothing1024](https://github.com/Chanzhaoyu/chatgpt-web/pull/523) - 修复 `AUTH_SECRET_KEY` 模式下跨域异常并添加对 `node.js 19` 版本的支持 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/499) - 确定清空上下文时不应该重置会话标题 ## Other - 调整文档 - 更新依赖 ## v2.10.4 `2023-03-11` ## Feature - 感谢 [Nothing1024](https://github.com/Chanzhaoyu/chatgpt-web/pull/268) 添加 `Prompt` 模板和 `Prompt` 商店支持 ## Enhancement - 设置添加关闭按钮[#495] ## Demo ![Prompt](https://camo.githubusercontent.com/6a51af751eb29238cb7ef4f8fbd89f63db837562f97f33273095424e62dc9194/68747470733a2f2f73312e6c6f63696d672e636f6d2f323032332f30332f30342f333036326665633163613562632e676966) ## v2.10.3 `2023-03-10` > 声明:除 `ChatGPTUnofficialProxyAPI` 使用的非官方代理外,本项目代码包括上游引用包均开源在 `GitHub`,如果你觉得本项目有监控后门或有问题导致你的账号、API被封,那我很抱歉。我可能`BUG`写的多,但我不缺德。此次主要为前端界面调整,周末愉快。 ## Feature - 支持长回复 [[yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/450)][[详情](https://github.com/Chanzhaoyu/chatgpt-web/pull/450)] - 支持 `PWA` [[chenxch](https://github.com/Chanzhaoyu/chatgpt-web/pull/452)] ## Enhancement - 调整移动端按钮和优化布局 - 调整 `iOS` 上安全距离 - 简化 `docker-compose` 部署 [[cloudGrin](https://github.com/Chanzhaoyu/chatgpt-web/pull/466)] ## BugFix - 修复清空会话侧边栏标题不会重置的问题 [[RyanXinOne](https://github.com/Chanzhaoyu/chatgpt-web/pull/453)] - 修复设置文字过长时导致的设置按钮消失的问题 ## Other - 更新依赖 ## v2.10.2 `2023-03-09` 衔接 `2.10.1` 版本[详情](https://github.com/Chanzhaoyu/chatgpt-web/releases/tag/v2.10.1) ## Enhancement - 移动端下输入框获得焦点时左侧按钮隐藏 ## BugFix - 修复 `2.10.1` 中添加 `OPENAI_API_MODEL` 变量的判断错误,会导致默认模型指定失效,抱歉 - 回退 `2.10.1` 中前端变量影响 `Docker` 打包 ## v2.10.1 `2023-03-09` 注意:删除了 `.env` 文件改用 `.env.example` 代替,如果是手动部署的同学现在需要手动创建 `.env` 文件并从 `.env.example` 中复制需要的变量,并且 `.env` 文件现在会在 `Git` 提交中被忽略,原因如下: - 在项目中添加 `.env` 从一开始就是个错误的示范 - 如果是 `Fork` 项目进行修改测试总是会被 `Git` 修改提示给打扰 - 感谢 [yi-ge](https://github.com/Chanzhaoyu/chatgpt-web/pull/395) 的提醒和修改 这两天开始,官方已经开始对第三方代理进行了拉闸, `accessToken` 即将或已经开始可能会不可使用。异常 `API` 使用也开始封号,封号缘由不明,如果出现使用 `API` 提示错误,请查看后端控制台信息,或留意邮箱。 ## Feature - 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/393) 添加是否发送上下文开关功能 ## Enhancement - 感谢 [nagaame](https://github.com/Chanzhaoyu/chatgpt-web/pull/415) 优化`docker`打包镜像文件过大的问题 - 感谢 [xieccc](https://github.com/Chanzhaoyu/chatgpt-web/pull/404) 新增 `API` 模型配置变量 `OPENAI_API_MODEL` - 感谢 [acongee](https://github.com/Chanzhaoyu/chatgpt-web/pull/394) 优化输出时滚动条问题 ## BugFix - 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/392) 修复导出图片会丢失头像的问题 - 修复深色模式导出图片的样式问题 ## v2.10.0 `2023-03-07` - 老规矩,手动部署的同学需要删除 `node_modules` 安装包重新安装降低出错概率,其他部署不受影响,但是可能会有缓存问题。 - 虽然说了更新放缓,但是 `issues` 不看, `PR` 不改我睡不着,我的邮箱从每天早上`8`点到凌晨`12`永远在滴滴滴,所以求求各位,超时的`issues`自己关闭下哈,我真的需要缓冲一下。 - 演示图片请看最后 ## Feature - 添加权限功能,用法:`service/.env` 中的 `AUTH_SECRET_KEY` 变量添加密码 - 感谢 [PeterDaveHello](https://github.com/Chanzhaoyu/chatgpt-web/pull/348) 添加「繁体中文」翻译 - 感谢 [GermMC](https://github.com/Chanzhaoyu/chatgpt-web/pull/369) 添加聊天记录导入、导出、清空的功能 - 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/374) 添加会话保存为本地图片的功能 ## Enhancement - 感谢 [CornerSkyless](https://github.com/Chanzhaoyu/chatgpt-web/pull/363) 添加 `ctrl+enter` 发送消息 - 现在新消息只有在结束了之后才滚动到底部,而不是之前的强制性 - 优化部分代码 ## BugFix - 转义状态码前端显示,防止直接暴露 `key`(我可能需要更多的状态码补充) ## Other - 更新依赖到最新 ## 演示 > 不是界面最新效果,有美化改动 权限 ![权限](https://user-images.githubusercontent.com/24789441/223438518-80d58d42-e344-4e39-b87c-251ff73925ed.png) 聊天记录导出 ![聊天记录导出](https://user-images.githubusercontent.com/57023771/223372153-6d8e9ec1-d82c-42af-b4bd-232e50504a25.gif) 保存图片到本地 ![保存图片到本地](https://user-images.githubusercontent.com/13901424/223423555-b69b95ef-8bcf-4951-a7c9-98aff2677e18.gif) ## v2.9.3 `2023-03-06` ## Enhancement - 感谢 [ChandlerVer5](https://github.com/Chanzhaoyu/chatgpt-web/pull/305) 使用 `markdown-it` 替换 `marked`,解决代码块闪烁的问题 - 感谢 [shansing](https://github.com/Chanzhaoyu/chatgpt-web/pull/277) 改善文档 - 感谢 [nalf3in](https://github.com/Chanzhaoyu/chatgpt-web/pull/293) 添加英文翻译 ## BugFix - 感谢[sepcnt ](https://github.com/Chanzhaoyu/chatgpt-web/pull/279) 修复切换记录时编辑状态未关闭的问题 - 修复复制代码的兼容性报错问题 - 修复部分优化小问题 ## v2.9.2 `2023-03-04` 手动部署的同学,务必删除根目录和`service`中的`node_modules`重新安装依赖,降低出现问题的概率,自动部署的不需要做改动。 ### Feature - 感谢 [hyln9](https://github.com/Chanzhaoyu/chatgpt-web/pull/247) 添加对渲染 `LaTex` 数学公式的支持 - 感谢 [ottocsb](https://github.com/Chanzhaoyu/chatgpt-web/pull/227) 添加支持 `webAPP` (苹果添加到主页书签访问)支持 - 添加 `OPENAI_API_BASE_URL` 可选环境变量[#249] ## Enhancement - 优化在高分屏上主题内容的最大宽度[#257] - 现在文字按单词截断[#215][#225] ### BugFix - 修复动态生成时代码块不能被复制的问题[#251][#260] - 修复 `iOS` 移动端输入框不会被键盘顶起的问题[#256] - 修复控制台渲染警告 ## Other - 更新依赖至最新 - 修改 `README` 内容 ## v2.9.1 `2023-03-02` ### Feature - 代码块添加当前代码语言显示和复制功能[#197][#196] - 完善多语言,现在可以切换中英文显示 ## Enhancement - 由[Zo3i](https://github.com/Chanzhaoyu/chatgpt-web/pull/187) 完善 `docker-compose` 部署文档 ### BugFix - 由 [ottocsb](https://github.com/Chanzhaoyu/chatgpt-web/pull/200) 修复头像修改不同步的问题 ## Other - 更新依赖至最新 - 修改 `README` 内容 ## v2.9.0 `2023-03-02` ### Feature - 现在能复制带格式的消息文本 - 新设计的设定页面,可以自定义姓名、描述、头像(链接方式) - 新增`403`和`404`页面以便扩展 ## Enhancement - 更新 `chatgpt` 使 `ChatGPTAPI` 支持 `gpt-3.5-turbo-0301`(默认) - 取消了前端超时限制设定 ## v2.8.3 `2023-03-01` ### Feature - 消息已输出内容不会因为中断而消失[#167] - 添加复制消息按钮[#133] ### Other - `README` 添加声明内容 ## v2.8.2 `2023-02-28` ### Enhancement - 代码主题调整为 `One Dark - light|dark` 适配深色模式 ### BugFix - 修复普通文本代码渲染和深色模式下的问题[#139][#154] ## v2.8.1 `2023-02-27` ### BugFix - 修复 `API` 版本不是 `Markdown` 时,普通 `HTML` 代码会被渲染的问题 [#146] ## v2.8.0 `2023-02-27` - 感谢 [puppywang](https://github.com/Chanzhaoyu/chatgpt-web/commit/628187f5c3348bda0d0518f90699a86525d19018) 修复了 `2.7.0` 版本中关于流输出数据的问题(使用 `nginx` 需要自行配置 `octet-stream` 相关内容) - 关于为什么使用 `octet-stream` 而不是 `sse`,是因为更好的兼容之前的模式。 - 建议更新到此版本获得比较完整的体验 ### Enhancement - 优化了部份代码和类型提示 - 输入框添加换行提示 - 移动端输入框现在回车为换行,而不是直接提交 - 移动端双击标题返回顶部,箭头返回底部 ### BugFix - 流输出数据下的问题[#122] - 修复了 `API Key` 下部份代码不换行的问题 - 修复移动端深色模式部份样式问题[#123][#126] - 修复主题模式图标不一致的问题[#126] ## v2.7.3 `2023-02-25` ### Feature - 适配系统深色模式 [#118](https://github.com/Chanzhaoyu/chatgpt-web/issues/103) ### BugFix - 修复用户消息能被渲染为 `HTML` 问题 [#117](https://github.com/Chanzhaoyu/chatgpt-web/issues/117) ## v2.7.2 `2023-02-24` ### Enhancement - 消息使用 [github-markdown-css](https://www.npmjs.com/package/github-markdown-css) 进行美化,现在支持全语法 - 移除测试无用函数 ## v2.7.1 `2023-02-23` 因为消息流在 `accessToken` 中存在解析失败和消息不完整等一系列的问题,调整回正常消息形式 ### Feature - 现在可以中断请求过长没有答复的消息 - 现在可以删除单条消息 - 设置中显示当前版本信息 ### BugFix - 回退 `2.7.0` 的消息不稳定的问题 ## v2.7.0 `2023-02-23` ### Feature - 使用消息流返回信息,反应更迅速 ### Enhancement - 样式的一点小改动 ## v2.6.2 `2023-02-22` ### BugFix - 还原修改代理导致的异常问题 ## v2.6.1 `2023-02-22` ### Feature - 新增 `Railway` 部署模版 ### BugFix - 手动打包 `Proxy` 问题 ## v2.6.0 `2023-02-21` ### Feature - 新增对 `网页 accessToken` 调用 `ChatGPT`,更智能不过不太稳定 [#51](https://github.com/Chanzhaoyu/chatgpt-web/issues/51) - 前端页面设置按钮显示查看当前后端服务配置 ### Enhancement - 新增 `TIMEOUT_MS` 环境变量设定后端超时时常(单位:毫秒)[#62](https://github.com/Chanzhaoyu/chatgpt-web/issues/62) ## v2.5.2 `2023-02-21` ### Feature - 增加对 `markdown` 格式的支持 [Demo](https://github.com/Chanzhaoyu/chatgpt-web/pull/77) ### BugFix - 重载会话时滚动条保持 ## v2.5.1 `2023-02-21` ### Enhancement - 调整路由模式为 `hash` - 调整新增会话添加到 - 调整移动端样式 ## v2.5.0 `2023-02-20` ### Feature - 会话 `loading` 现在显示为光标动画 - 会话现在可以再次生成回复 - 会话异常可以再次进行请求 - 所有删除选项添加确认操作 ### Enhancement - 调整 `chat` 为路由页面而不是组件形式 - 更新依赖至最新 - 调整移动端体验 ### BugFix - 修复移动端左侧菜单显示不完整的问题 ## v2.4.1 `2023-02-18` ### Enhancement - 调整部份移动端上的样式 - 输入框支持换行 ## v2.4.0 `2023-02-17` ### Feature - 响应式支持移动端 ### Enhancement - 修改部份描述错误 ## v2.3.3 `2023-02-16` ### Feature - 添加 `README` 部份说明和贡献列表 - 添加 `docker` 镜像 - 添加 `GitHub Action` 自动化构建 ### BugFix - 回退依赖更新导致的 [Eslint 报错](https://github.com/eslint/eslint/issues/16896) ## v2.3.2 `2023-02-16` ### Enhancement - 更新依赖至最新 - 优化部份内容 ## v2.3.1 `2023-02-15` ### BugFix - 修复多会话状态下一些意想不到的问题 ## v2.3.0 `2023-02-15` ### Feature - 代码类型信息高亮显示 - 支持 `node ^16` 版本 - 移动端响应式初步支持 - `vite` 中 `proxy` 代理 ### Enhancement - 调整超时处理范围 ### BugFix - 修复取消请求错误提示会添加到信息中 - 修复部份情况下提交请求不可用 - 修复侧边栏宽度变化闪烁的问题 ## v2.2.0 `2023-02-14` ### Feature - 会话和上下文本地储存 - 侧边栏本地储存 ## v2.1.0 `2023-02-14` ### Enhancement - 更新依赖至最新 - 联想功能移动至前端提交,后端只做转发 ### BugFix - 修复部份项目检测有关 `Bug` - 修复清除上下文按钮失效 ## v2.0.0 `2023-02-13` ### Refactor 重构并优化大部分内容 ## v1.0.5 `2023-02-12` ### Enhancement - 输入框焦点,连续提交 ### BugFix - 修复信息框样式问题 - 修复中文输入法提交问题 ## v1.0.4 `2023-02-11` ### Feature - 支持上下文联想 ## v1.0.3 `2023-02-11` ### Enhancement - 拆分 `service` 文件以便扩展 - 调整 `Eslint` 相关验证 ### BugFix - 修复部份控制台报错 ## v1.0.2 `2023-02-10` ### BugFix - 修复新增信息容器不会自动滚动到问题 - 修复文本过长不换行到问题 [#1](https://github.com/Chanzhaoyu/chatgpt-web/issues/1) ================================================ FILE: CONTRIBUTING.en.md ================================================ # Contribution Guide Thank you for your valuable time. Your contributions will make this project better! Before submitting a contribution, please take some time to read the getting started guide below. ## Semantic Versioning This project follows semantic versioning. We release patch versions for important bug fixes, minor versions for new features or non-important changes, and major versions for significant and incompatible changes. Each major change will be recorded in the `changelog`. ## Submitting Pull Request 1. Fork [this repository](https://github.com/Chanzhaoyu/chatgpt-web) and create a branch from `main`. For new feature implementations, submit a pull request to the `feature` branch. For other changes, submit to the `main` branch. 2. Install the `pnpm` tool using `npm install pnpm -g`. 3. Install the `Eslint` plugin for `VSCode`, or enable `eslint` functionality for other editors such as `WebStorm`. 4. Execute `pnpm bootstrap` in the root directory. 5. Execute `pnpm install` in the `/service/` directory. 6. Make changes to the codebase. If applicable, ensure that appropriate testing has been done. 7. Execute `pnpm lint:fix` in the root directory to perform a code formatting check. 8. Execute `pnpm type-check` in the root directory to perform a type check. 9. Submit a git commit, following the [Commit Guidelines](#commit-guidelines). 10. Submit a `pull request`. If there is a corresponding `issue`, please link it using the [linking-a-pull-request-to-an-issue keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword). ## Commit Guidelines Commit messages should follow the [conventional-changelog standard](https://www.conventionalcommits.org/en/v1.0.0/): ```bash [optional scope]: [optional body] [optional footer] ``` ### Commit Types The following is a list of commit types: - feat: New feature or functionality - fix: Bug fix - docs: Documentation update - style: Code style or component style update - refactor: Code refactoring, no new features or bug fixes introduced - perf: Performance optimization - test: Unit test - chore: Other commits that do not modify src or test files ## License [MIT](./license) ================================================ FILE: CONTRIBUTING.md ================================================ # 贡献指南 感谢你的宝贵时间。你的贡献将使这个项目变得更好!在提交贡献之前,请务必花点时间阅读下面的入门指南。 ## 语义化版本 该项目遵循语义化版本。我们对重要的漏洞修复发布修订号,对新特性或不重要的变更发布次版本号,对重大且不兼容的变更发布主版本号。 每个重大更改都将记录在 `changelog` 中。 ## 提交 Pull Request 1. Fork [此仓库](https://github.com/Chanzhaoyu/chatgpt-web),从 `main` 创建分支。新功能实现请发 pull request 到 `feature` 分支。其他更改发到 `main` 分支。 2. 使用 `npm install pnpm -g` 安装 `pnpm` 工具。 3. `vscode` 安装了 `Eslint` 插件,其它编辑器如 `webStorm` 打开了 `eslint` 功能。 4. 根目录下执行 `pnpm bootstrap`。 5. `/service/` 目录下执行 `pnpm install`。 6. 对代码库进行更改。如果适用的话,请确保进行了相应的测试。 7. 请在根目录下执行 `pnpm lint:fix` 进行代码格式检查。 8. 请在根目录下执行 `pnpm type-check` 进行类型检查。 9. 提交 git commit, 请同时遵守 [Commit 规范](#commit-指南) 10. 提交 `pull request`, 如果有对应的 `issue`,请进行[关联](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword)。 ## Commit 指南 Commit messages 请遵循[conventional-changelog 标准](https://www.conventionalcommits.org/en/v1.0.0/): ```bash <类型>[可选 范围]: <描述> [可选 正文] [可选 脚注] ``` ### Commit 类型 以下是 commit 类型列表: - feat: 新特性或功能 - fix: 缺陷修复 - docs: 文档更新 - style: 代码风格或者组件样式更新 - refactor: 代码重构,不引入新功能和缺陷修复 - perf: 性能优化 - test: 单元测试 - chore: 其他不修改 src 或测试文件的提交 ## License [MIT](./license) ================================================ FILE: Dockerfile ================================================ # build front-end FROM node:lts-alpine AS frontend RUN npm install pnpm -g # 安装 Git RUN apk add --no-cache git WORKDIR /app COPY ./package.json /app COPY ./pnpm-lock.yaml /app #RUN git --version RUN pnpm install COPY . /app RUN pnpm run build # build backend FROM node:lts-alpine as backend RUN npm install pnpm -g WORKDIR /app COPY /service/package.json /app COPY /service/pnpm-lock.yaml /app RUN pnpm install COPY /service /app RUN pnpm build # service FROM node:lts-alpine RUN npm install pnpm -g WORKDIR /app COPY /service/package.json /app COPY /service/pnpm-lock.yaml /app RUN pnpm install --production && rm -rf /root/.npm /root/.pnpm-store /usr/local/share/.cache /tmp/* COPY /service /app COPY --from=frontend /app/dist /app/public COPY --from=backend /app/build /app/build EXPOSE 3002 CMD ["pnpm", "run", "prod"] ================================================ FILE: README.md ================================================ # ChatGPT Web Midjourney Proxy [English](./README_EN.md) | [Русский язык](./README_RU.md) | [Français](./README_FR.md) | [한국어](./README_KR.md) | [Tiếng Việt](./README_VN.md) | [Türkçe](./README_TR.md) ## 声明 - 此项目只发布于 GitHub,基于 MIT 协议,免费且作为开源学习使用。并且不会有任何形式的卖号、付费服务、讨论群、讨论组等行为。谨防受骗。 - 本开源是在 [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web) 基础上做二次开发 ;使用 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 、 Suno-API、[Luma-API](https://github.com/LumaAI-API/Luma-API) 作为后端API而形成的; - 可以直接用 https://vercel.ddaiai.com 先体验 ![cover](./docs/mj2a1.jpg) ## 支持功能 - [x] 支持 udio 文生音乐 - [x] 支持 pika 文生视频,图生视频 - [x] 支持 openai realtime [点击观看.youtube](https://www.youtube.com/watch?v=pKvVi3oBRQU) [B站](https://www.bilibili.com/video/BV1Kt22YPE2c/) - [x] 支持 kling 可灵 文生视频,图生视频, 绘图 - [x] 支持 ideogram 绘图 - [x] 支持 runway 文生视频,图生视频 - [x] 支持 luma 文生视频,图生视频 - [x] 支持 viggle 舞蹈 - [x] 支持 suno 单独模块,可歌词调整 曲风调整 - [x] 支持 suno 以音频生成音频 - [x] 支持 flux dall.e 文生图 - [x] 原chatgpt web 所有功能 - [x] chatgpt web 支持自定义api key、base_url - [x] midjourney 文生图、垫图+文生图 、图变 U1到U4 、 V1到V4、重绘等操作 - [X] midjourney 支持局部重绘、支持1.5倍变焦 2倍变焦、2倍高清 4倍高清 - [X] midjourney 支持左、右、上、下延伸变化 - [X] midjourney 同时支持[midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 接口 和 [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) 接口 - [X] midjourney 图生文 - [X] 图片使用localforage实现本地存储 - [X] 支持midjourney、niji 不同机器人 - [X] 支持[InsightFace 人脸替换](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] midjourney 混图、获取 seed - [X] chatgpt 前端支持自定义模型、上下文对话数、回复数 - [X] chatgpt 支持图片上传图片 供gpt-4-vision-preview使用、gpts - [X] chatgpt 支持超链模型切换 https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] 支持ChatGPT试的超链模型切换 https://chat.openai.com/g/g-2fkFE8rbu 修改为 https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] chatgpt 支持 GPTs 多模态 - [X] chatgpt 支持 tts whisper dall-e-3 画图 - [X] 即时语音识别(浏览器自带语音识别 ASR) `v2.15.7`以上版本 - [X] 支持超链更换设置,适合`one-api` `new-api`部署聊天(为了安全,此方式请使用自己域名) https://mj.your-name.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] 支持`one-api`、`new-api`部署聊天 (为了安全,此方式请使用自己域名) https://mj.your-name.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## 无服务器-个人桌面安装 > - [x] 请到 https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases 下载最新版本安装(选择合适你操作系统的版本) > - [x] 选择一个合适的中转服务商( 最好都支持 `gpt` `gpts` `midjourney` `claude` `suno` `luma` `runway` `viggle` `flux` `ideogram` `kling` `pika`) > - [x] 中转服务商推荐 https://www.openai-hk.com 一个`key`和`api接口地址` 同时支持 [gpt](https://www.openai-hk.com/docs/getting-started.html) [gpts](https://www.openai-hk.com/docs/openai/gpts.html) [midjourney](https://www.openai-hk.com/docs/midjourney/guide.html) [claude](https://www.openai-hk.com/docs/lab/claude-3.html) [suno](https://www.openai-hk.com/docs/lab/suno-v3.html) [luma](https://www.openai-hk.com/docs/lab/luma-video.html) [runway](https://www.openai-hk.com/docs/lab/runway-video.html) [viggle](https://www.openai-hk.com/docs/lab/viggle-dance.html) [ideogram](https://www.openai-hk.com/docs/lab/ideogram.html) [flux](https://www.openai-hk.com/docs/lab/flux.html) [kling](https://www.openai-hk.com/docs/lab/kling.html) [pika](https://www.openai-hk.com/docs/lab/pika-video.html) [Riffusion](https://www.openai-hk.com/docs/lab/riffusion-music.html) ![多模态](./docs/suno-ds.jpg) ## Vercel 一键部署 [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## env 环境变量 | 环境变量 | 说明 | 默认值 |docker等部署| vercel 部署| | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | OpenAI API 接口地址 | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | OpenAI API 密钥 | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | 默认模型 | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | mj proxy 接口地址 |[搭建参考](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | mj proxy | 空 | ✅ | ✅| | SUNO_SERVER | SUNO API 接口地址 | [搭建参考](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | SUNO API 的key | 空 | ✅ | ✅| | AUTH_SECRET_KEY | 访问授权密码 | 无 | ✅ | x| | API_UPLOADER | 支持上传 | 关闭 | ✅ | x| | HIDE_SERVER | 前端ui隐藏服务端| | ✅ | x| | CUSTOM_MODELS | 自定义可选模型 `CUSTOM_MODELS=-all,gpt-3.5` | 无 | ✅ | ✅| | TJ_BAIDU_ID | 百度统计ID | 无 | ✅ | ✅| | TJ_GOOGLE_ID | 谷歌统计ID | 无 | ✅ | ✅| | SYS_NOTIFY | 系统通知,支持HTML | 无 | ✅ | ✅| | DISABLE_GPT4 | 禁用GPT-4 | 无 | ✅ | ✅| | GPT_URL | 自定 GPT_URL=/gpts.json | 无 也可自己的外链 | ✅ | ✅| | UPLOAD_IMG_SIZE | 上传图片大小限制 默认1M | 1 | ✅ | ✅| | SYS_THEME | 默认主题 `light`或者`dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | 是否开启 `wsrv`图床 | 无(关闭) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | 防爆破验证:验证次数触发 NGINX 请设置 `proxy_set_header X-Forwarded-For $remote_addr` | 无 | ✅ | x| | AUTH_SECRET_ERROR_TIME | 防爆破验证:停留时间 单位分钟 | 无 | ✅ | x| | CLOSE_MD_PREVIEW | 是否不关闭输入预览 | 无 | ✅ | ✅| | UPLOAD_TYPE | 指定上传方式 [`R2` R2上传] [`API` 跟随UI前端中转]、[`Container` 本地容器]、[`MyUrl` 自定义链接] | 空 | ✅ | x| | MENU_DISABLE | 菜单禁用 可选:gpts,draws,gallery,music,video,dance,realtime | 空 | ✅ | ✅| | VISION_MODEL | 默认使用的识图 可选:`gpt-4o`,`gpt-4-turb`,`gpt-4-vision-preview`等 | 空 | ✅ | ✅| | SYSTEM_MESSAGE | 自定义默认角色消息 | 空 | ✅ | ✅| | CUSTOM_VISION_MODELS | 自定义可视图模型 用`,` 分开 | 空 | ✅ | ✅| | LUMA_SERVER | LUMA API 接口地址 | [搭建参考](https://github.com/LumaAI-API/Luma-API) | ✅ | ✅| | LUMA_KEY | LUMA API 的key | 空 | ✅ | ✅| ## docker 部署 > - [x] 需 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 或者[trueai](https://github.com/trueai-org/midjourney-proxy) 支持 > - [x] 需 Suno-API 支持 > - [x] 需 [Luma-API](https://github.com/LumaAI-API/Luma-API) 支持 ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e LUMA_SERVER=https://your-luma-server:8000 \ -e LUMA_KEY=your-luma-key \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` 访问 http://ip:6015 **文件上传**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` 如果是前端ui设置 OPENAI_API_KEY OPENAI_API_BASE_URL ; 图片上传也会随着走 OPENAI_API_BASE_URL走 ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` 返回格式 ```json { "url":"https://xxxxxxx.jpg" } ``` ### midjourney-proxy API docker部署 更多参考到 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 开源光光 ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=discord服务ID \ -e mj.discord.channel-id=discord服务组ID \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## 更多展示 ### Realtime [点击观看Realtime视频](https://www.youtube.com/watch?v=pKvVi3oBRQU)
### suno、udio 音乐AI制作 ![suno](./docs/suno2.jpg) ### luma runway pika kling 视频AI制作 ![suno](./docs/luma-video.jpg) ### 自定义服务端api key、base_url: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![多模态](./docs/gpts.jpg) ![多模态](./docs/gpts1.jpg) ### 录音 whisper 和 tts ![whisper--tts](./docs/tts-whisper.png) ### 局部重绘: [![局部重绘](./docs/mj2.jpg)](./docs/mj2.jpg) ### 换脸 ![换脸](./docs/mj2a2.jpg) ### 混图 ![混图](./docs/mj2a3.jpg) ### 支持图片上传图片 供gpt-4-vision-preview使用 ![混图](./docs/mj4a1.png) 手机端:
## 文件上传 支持cloudflare r2 存储 - cloudflare r2 存储 10 GB/月 免费 https://www.cloudflare.com/zh-cn/developer-platform/r2/ - 配置文档参考 https://zhuanlan.zhihu.com/p/658058503 - vercel 不支持 r2 存储 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## 文件服务器请求优先顺序 R2> 前端UI设置文件服务> 后端文件服务 >跟随中转 ## 防爆破验证设置 ![防爆破](./docs/check_error.jpg) - [x] vercel 不支持;仅支持Docker化部署 - [x] 如果前面挂载 `nginx` 请配置 `proxy_set_header X-Forwarded-For $remote_addr;` - [x] 参数如下: 错误验证3次,只能在10分钟后再验证 ```yml # Secret key 注意: 只能拿事英文+数字 AUTH_SECRET_KEY=my888god #爆破:验证次数 注意: 数字 ;nginx 请设置 proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 #爆破:验证停留时间 单位分钟 注意: 是数字 AUTH_SECRET_ERROR_TIME=10 ``` - [x] 脚本如下 ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=你的英文密码 -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` - ## License MIT © [Dooy](./license) ## 其他 如果觉得这个项目对您有所帮助,请帮忙点个star 或者捐助我们 [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## 捐助 如果我的开源项目对你有帮助,请考虑通过以下任意一种方式赞助:
`付款备注上您的联系方式`
微信捐助
支付宝捐助
================================================ FILE: README_EN.md ================================================ # ChatGPT Web Midjourney Proxy [中文](./README_ZH.md) | [Русский язык](./README_RU.md) | [Français](./README_FR.md) | [한국어](./README_KR.md) | [Tiếng Việt](./README_VN.md) | [Türkçe](./README_TR.md) ## Disclaimer - This project is only released on GitHub under the MIT license, free and open-source for learning purposes. There will be no form of account selling, paid services, discussion groups, etc. Beware of scams. - This open-source project is developed based on [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web); it uses the midjourney API provided by [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) and [Suno-API] as the backend. ![cover](./docs/mj2a1.jpg) ## Supported Features - [x] Support Kling for text-to-video, image-to-video, and drawing. - [x] Support Ideogram for drawing. - [x] Support Runway for text-to-video and image-to-video. - [x] Support Luma for text-to-video and image-to-video. - [x] Support Viggle for dance. - [x] Support Suno for audio-to-audio generation. - [x] Support for the standalone Suno module, with adjustable lyrics and music style - [x] All original ChatGPT web features - [x] ChatGPT web supports custom API keys and base_url - [x] Midjourney text-to-image - [x] Midjourney blend image + text-to-image - [X] Midjourney image variations U1 to U4, V1 to V4, and redrawing - [X] Midjourney partial redrawing - [X] Midjourney 1.5x and 2x zoom - [X] Midjourney 2x and 4x HD - [X] Midjourney extensions to the left, right, top, and bottom - [X] Midjourney supports both [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) and [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) - [X] Midjourney text from images - [X] Local image storage using localforage - [X] Support for different bots like midjourney and niji - [X] Support for [InsightFace face replacement](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] Midjourney image blending - [X] Midjourney get seed - [X] DALL-E-3 image generation - [X] ChatGPT front-end model selection - [X] ChatGPT front-end supports custom models, context number, and reply count - [X] ChatGPT supports image uploads for GPT-4-Vision-Preview - [X] ChatGPT supports file backend uploads (for models like GPT-4-All, GPT-4-Gizmo-xxx) by default off, can be enabled with environment variable API_UPLOADER=1 - [X] ChatGPT supports reverse models like GPT-4-All, GPT-4-V, GPT-4-Gizmo-(gizmo_id) - [X] ChatGPT supports hyperlink model switching https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] ChatGPT supports ChatGPT-style hyperlink model switching https://chat.openai.com/g/g-2fkFE8rbu modified to https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] ChatGPT supports GPTs multimodal - [X] ChatGPT supports TTS whisper - [X] Instant voice recognition (browser's built-in ASR) `v2.15.7` and above - [X] Support hyperlink change settings, suitable for `one-api` and `new-api` deployments https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] Support `one-api` and `new-api` deployments https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## Serverless - Personal Desktop Installation > - [x] Please download the latest version from https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases (choose the version suitable for your operating system) > - [x] Choose an appropriate proxy service (preferably one that supports `gpt`, `gpts`, `midjourney`, `claude`, `suno`) > - [x] Recommended proxy service https://www.openai-hk.com a `key` and `api interface address` support `gpt`, `midjourney`, `claude`, `suno` simultaneously, mj-fast as low as 0.12 RMB/image ![multimodal](./docs/suno-ds.jpg) ## Vercel One-Click Deployment [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## env Environment Variables | Environment Variable | Description | Default Value | Docker Deployment | Vercel Deployment | | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | OpenAI API interface address | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | OpenAI API key | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | Default model | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | MJ proxy interface address | [Reference for setup](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | MJ proxy secret | Empty | ✅ | ✅| | SUNO_SERVER | SUNO API interface address | [Reference for setup](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | SUNO API key | Empty | ✅ | ✅| | AUTH_SECRET_KEY | Access authorization password | None | ✅ | x| | API_UPLOADER | Support upload | Disabled | ✅ | x| | HIDE_SERVER | Hide server UI on the front end | | ✅ | x| | CUSTOM_MODELS | Custom selectable models | None | ✅ | ✅| | TJ_BAIDU_ID | Baidu Analytics ID | None | ✅ | ✅| | TJ_GOOGLE_ID | Google Analytics ID | None | ✅ | ✅| | SYS_NOTIFY | System notifications, supports HTML | None | ✅ | ✅| | DISABLE_GPT4 | Disable GPT-4 | None | ✅ | ✅| | GPT_URL | Custom GPT_URL=/gpts.json | None or your external link | ✅ | ✅| | UPLOAD_IMG_SIZE | GPT4V upload image size | 1 | ✅ | ✅| | SYS_THEME | Default theme `light` or `dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | Enable `wsrv` image bed | None (disabled) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | Brute force prevention: Number of verification attempts NGINX please set `proxy_set_header X-Forwarded-For $remote_addr` | None | ✅ | x| | AUTH_SECRET_ERROR_TIME | Brute force prevention: Wait time in minutes | None | ✅ | x| | CLOSE_MD_PREVIEW | Do not close input preview | None | ✅ | ✅| | UPLOAD_TYPE | Specify upload method [`R2` R2 upload] [`API` Follow UI front-end relay] [`Container` Local container] [`MyUrl` Custom link] | Empty | ✅ | x| | MENU_DISABLE | Disable menu options: gpts, draws, gallery, music | Empty | ✅ | ✅| | VISION_MODEL | Default recognition model Options: `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview`, etc. | Empty | ✅ | ✅| | SYSTEM_MESSAGE | Custom default role message | Empty | ✅ | ✅| | CUSTOM_VISION_MODELS | Custom vision models separated by `,` | Empty | ✅ | ✅| ## Docker Deployment > - [x] Requires [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) support > - [x] Requires [Suno-API] support ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatg pt-web-midjourney-proxy ``` Access http://ip:6015 **File Upload**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` If the front-end UI sets OPENAI_API_KEY and OPENAI_API_BASE_URL, the image upload will also follow the OPENAI_API_BASE_URL. ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` Return format ```json { "url":"https://xxxxxxx.jpg" } ``` ### Midjourney-proxy API Docker Deployment For more references, go to [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) open-source project. ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=Discord Server ID \ -e mj.discord.channel-id=Discord Server Group ID \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## More Demonstrations ### Custom Server API Key, Base_URL: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![multimodal](./docs/gpts.jpg) ![multimodal](./docs/gpts1.jpg) ### Suno Music Creation ![suno](./docs/suno.jpg) ### Recording Whisper and TTS ![whisper--tts](./docs/tts-whisper.png) ### Partial Redraw: [![Partial Redraw](./docs/mj2.jpg)](./docs/mj2.jpg) ### Face Replacement ![Face Replacement](./docs/mj2a2.jpg) ### Image Blending ![Image Blending](./docs/mj2a3.jpg) ### Support for Image Upload for GPT-4-Vision-Preview ![Image Blending](./docs/mj4a1.png) Mobile:
## File Upload Support for Cloudflare R2 Storage - Cloudflare R2 storage 10 GB/month free https://www.cloudflare.com/zh-cn/developer-platform/r2/ - Configuration reference https://zhuanlan.zhihu.com/p/658058503 - Vercel does not support R2 storage ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## File Server Request Priority R2 > Front-end UI set file service > Backend file service > Follow proxy ## Brute Force Prevention Settings ![Brute Force Prevention](./docs/check_error.jpg) - [x] Vercel is not supported; only Docker deployment is supported - [x] If NGINX is mounted in front, configure `proxy_set_header X-Forwarded-For $remote_addr;` - [x] Parameters: 3 failed verification attempts, can only reattempt after 10 minutes ```yml # Secret key Note: Only alphanumeric characters AUTH_SECRET_KEY=my888god # Brute force: verification attempts Note: Number; NGINX please set proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 # Brute force: wait time in minutes Note: Number AUTH_SECRET_ERROR_TIME=10 ``` - [x] Script: ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=your-english-password -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` ## License MIT © [Dooy](./license) ## Others If you find this project helpful, please consider giving it a star or donating to us. [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## Donations If my open-source project is helpful to you, please consider sponsoring me through any of the following methods:
`Payment remarks with your contact information`
WeChat Donation
Alipay Donation
================================================ FILE: README_FR.md ================================================ # ChatGPT Web Midjourney Proxy 💡**Déclaration** - Ce projet n'est publié que sur GitHub, sous licence MIT, gratuit et destiné à un usage d'apprentissage open source. Il n'y aura aucune vente de comptes, service payant, groupe de discussion, etc. Soyez vigilant face aux arnaques. - Ce projet open source est basé sur [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web) et utilise l'API midjourney de [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) et [Suno-API](https://github.com/SunoAI-API/Suno-API) comme backend. ![couverture](./docs/mj2a1.jpg) ## Fonctionnalités prises en charge - [x] Prise en charge du module Suno, ajustement des paroles et du style musical - [x] Toutes les fonctionnalités de chatgpt web - [x] chatgpt web prend en charge la personnalisation de l'API key et de base_url - [x] Création d'images par texte avec midjourney - [x] Image de base + création d'images par texte avec midjourney - [X] Opérations de variation (U1 à U4, V1 à V4, redessiner) avec midjourney - [X] Redessin partiel avec midjourney - [X] Zoom 1,5x et 2x avec midjourney - [X] Haute définition 2x et 4x avec midjourney - [X] Extension à gauche, droite, haut et bas avec midjourney - [X] Prise en charge des interfaces [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) et [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) avec midjourney - [X] Création de texte par image avec midjourney - [X] Stockage local des images avec localforage - [X] Prise en charge des robots midjourney et niji - [X] Prise en charge du remplacement de visage [InsightFace](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] Mélange d'images avec midjourney - [X] Obtention de seed avec midjourney - [X] Création d'images avec dall-e-3 - [X] Sélection de modèle en frontend avec chatgpt - [X] Prise en charge de la personnalisation des modèles, du nombre de dialogues et de réponses en frontend avec chatgpt - [X] Prise en charge du téléchargement d'images pour gpt-4-vision-preview avec chatgpt - [X] Prise en charge du téléchargement de fichiers en backend pour les modèles gpt-4-all, gpt-4-gizmo-xxx (désactivé par défaut, activation par variable d'environnement API_UPLOADER=1) - [X] Prise en charge des modèles inversés gpt-4-all, gpt-4-v, gpt-4-gizmo-(gizmo_id) avec chatgpt - [X] Prise en charge du changement de modèle par lien hypertexte https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] Prise en charge du changement de modèle par lien hypertexte pour ChatGPT https://chat.openai.com/g/g-2fkFE8rbu modifié en https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] Prise en charge des modèles multi-modaux GPTs avec chatgpt - [X] Prise en charge de tts whisper avec chatgpt - [X] Reconnaissance vocale instantanée (ASR intégré au navigateur) à partir de la version `v2.15.7` - [X] Prise en charge de la modification des paramètres par lien hypertexte, adapté pour les déploiements `one-api` et `new-api` de chat https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] Prise en charge des déploiements de chat `one-api` et `new-api` https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## Installation sur ordinateur personnel sans serveur > - [x] Téléchargez la dernière version sur https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases (choisissez la version adaptée à votre système d'exploitation) > - [x] Choisissez un service de relais approprié (de préférence supportant `gpt`, `gpts`, `midjourney`, `claude`, `suno`) > - [x] Service de relais recommandé https://www.openai-hk.com, un `key` et une `adresse d'interface API` supportant simultanément `gpt`, `midjourney`, `claude`, `suno`, avec un coût minimum de 0,12 RMB par image pour mj-fast ![multi-modale](./docs/suno-ds.jpg) ## Déploiement en un clic sur Vercel [![Déployer avec Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## Variables d'environnement (env) | Variable d'environnement | Description | Valeur par défaut | Déploiement docker | Déploiement vercel | | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | Adresse de l'interface API OpenAI | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | Clé API OpenAI | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | Modèle par défaut | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | Adresse de l'interface mj proxy |[Référence d'installation](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | Secret API mj proxy | vide | ✅ | ✅| | SUNO_SERVER | Adresse de l'interface API SUNO | [Référence d'installation](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | Clé API SUNO | vide | ✅ | ✅| | AUTH_SECRET_KEY | Mot de passe d'accès autorisé | Aucun | ✅ | x| | API_UPLOADER | Support de téléchargement | Désactivé | ✅ | x| | HIDE_SERVER | Masquer le serveur dans l'interface utilisateur | | ✅ | x| | CUSTOM_MODELS | Modèles personnalisés disponibles | Aucun | ✅ | ✅| | TJ_BAIDU_ID | ID de statistiques Baidu | Aucun | ✅ | ✅| | TJ_GOOGLE_ID | ID de statistiques Google | Aucun | ✅ | ✅| | SYS_NOTIFY | Notification système, supporte HTML | Aucun | ✅ | ✅| | DISABLE_GPT4 | Désactiver GPT-4 | Aucun | ✅ | ✅| | GPT_URL | URL personnalisée GPT_URL=/gpts.json | Aucune ou lien externe personnalisé | ✅ | ✅| | UPLOAD_IMG_SIZE | Taille de l'image uploadée pour gpt4v | 1 | ✅ | ✅| | SYS_THEME | Thème par défaut `light` ou `dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | Activer le stockage d'images `wsrv` | Aucun (désactivé) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | Vérification anti-brute-force : Nombre de tentatives de vérification, NGINX doit définir `proxy_set_header X-Forwarded-For $remote_addr` | Aucun | ✅ | x| | AUTH_SECRET_ERROR_TIME | Vérification anti-brute-force : Temps d'attente en minutes | Aucun | ✅ | x| | CLOSE_MD_PREVIEW | Désactiver l'aperçu en entrée | Aucun | ✅ | ✅| | UPLOAD_TYPE | Type de téléchargement spécifié [`R2` pour R2] [`API` via l'interface utilisateur] [`Container` pour le stockage local] [`MyUrl` pour un lien personnalisé] | vide | ✅ | x| | MENU_DISABLE | Désactiver des menus sélectionnés : gpts, draws, gallery, music | vide | ✅ | ✅| | VISION_MODEL | Modèle de reconnaissance par défaut : `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview`, etc. | vide | ✅ | ✅| | SYSTEM_MESSAGE | Message de rôle par défaut personnalisé | vide | ✅ | ✅| | CUSTOM_VISION_MODELS | Modèles de vision personnalisés, séparés par des virgules | vide | ✅ | ✅| ## Déploiement docker > - [x] Nécessite [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) > - [x] Nécessite [Suno-API](https://github.com/SunoAI-API/Suno-API) ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` Accédez à http://ip:6015 **Téléchargement de fichiers**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` Si la configuration de l'interface utilisateur FRONT-END est OPENAI_API_KEY et OPENAI_API_BASE_URL; le téléchargement d'images suivra également OPENAI_API_BASE_URL. ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` Réponse formatée ```json { "url":"https://xxxxxxx.jpg" } ``` ### Déploiement de l'API midjourney-proxy avec docker Référez-vous à [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) pour plus de détails ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=ID du serveur discord \ -e mj.discord.channel-id=ID du groupe discord \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## Plus d'exemples ### API key et base_url personnalisés en serveur: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![multi-modale](./docs/gpts.jpg) ![multi-modale](./docs/gpts1.jpg) ### Création musicale avec suno ![suno](./docs/suno.jpg) ### Enregistrement whisper et tts ![whisper--tts](./docs/tts-whisper.png) ### Redessin partiel: [![redessin partiel](./docs/mj2.jpg)](./docs/mj2.jpg) ### Remplacement de visage ![remplacement de visage](./docs/mj2a2.jpg) ### Mélange d'images ![mélange d'images](./docs/mj2a3.jpg) ### Prise en charge du téléchargement d'images pour gpt-4-vision-preview ![gpt-4-vision-preview](./docs/mj4a1.png) Mobile:
## Téléchargement de fichiers avec stockage cloudflare r2 - Stockage gratuit jusqu'à 10 Go/mois avec cloudflare r2 https://www.cloudflare.com/zh-cn/developer-platform/r2/ - Documentation de configuration https://zhuanlan.zhihu.com/p/658058503 - Vercel ne supporte pas le stockage r2 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## Ordre de priorité des demandes au serveur de fichiers R2 > Configuration de l'interface utilisateur > Serveur de fichiers backend > Relais ## Paramètres de vérification anti-brute-force ![anti-brute-force](./docs/check_error.jpg) - [x] Vercel ne supporte pas ; uniquement supporté pour les déploiements Docker - [x] Si nginx est utilisé en amont, configurez `proxy_set_header X-Forwarded-For $remote_addr;` - [x] Paramètres : 3 tentatives, vérification possible après 10 minutes ```yml # Clé secrète : utilisez uniquement des lettres et des chiffres AUTH_SECRET_KEY=my888god # anti-brute-force : nombre de tentatives. Pour nginx, configurez proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 # anti-brute-force : temps d'attente en minutes AUTH_SECRET_ERROR_TIME=10 ``` - [x] Script ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=mot-de-passe -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` ## Licence MIT © [Dooy](./license) ## Autre Si vous trouvez ce projet utile, veuillez nous soutenir en mettant une étoile ou en faisant un don. [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## Donation Si mon projet open source vous a été utile, veuillez envisager de faire un don via l'une des méthodes suivantes :
`Mentionnez vos coordonnées dans la note de paiement`
Don via WeChat
Don via Alipay
================================================ FILE: README_KR.md ================================================ # ChatGPT Web Midjourney Proxy 💡**선언** - 이 프로젝트는 GitHub에만 게시되며, MIT 라이센스를 기반으로 무료로 오픈 소스 학습용으로 사용됩니다. 어떤 형태의 계정 판매, 유료 서비스, 토론 그룹 등의 행위도 없으니 사기를 조심하십시오. - 이 오픈 소스는 [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web)를 기반으로 2차 개발된 것이며, [midjourney-proxy](https://github.com/novicezk/midjourney-proxy)가 제공하는 midjourney API와 [Suno-API](https://github.com/SunoAI-API/Suno-API)를 백엔드로 사용하여 형성되었습니다. ![cover](./docs/mj2a1.jpg) ## 지원 기능 - [x] suno 단독 모듈 지원, 가사 조정, 곡 스타일 조정 가능 - [x] 원래 chatgpt 웹의 모든 기능 - [x] chatgpt 웹 지원 사용자 정의 API 키, base_url - [x] midjourney 텍스트로 이미지 생성 - [x] midjourney 텍스트와 이미지로 이미지 생성 - [X] midjourney 이미지 변환 U1에서 U4, V1에서 V4, 재그리기 등 작업 - [X] midjourney 부분 재그리기 지원 - [X] midjourney 1.5배 확대, 2배 확대 지원 - [X] midjourney 2배 HD, 4배 HD 지원 - [X] midjourney 좌, 우, 상, 하 확장 지원 - [X] midjourney와 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 인터페이스 및 [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) 인터페이스 동시 지원 - [X] midjourney 이미지에서 텍스트 생성 - [X] localforage를 사용한 이미지 로컬 저장 - [X] midjourney 및 niji 다양한 로봇 지원 - [X] [InsightFace 얼굴 교체](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) 지원 - [X] midjourney 이미지 합성 - [X] midjourney 시드 가져오기 - [X] dall-e-3 이미지 생성 - [X] chatgpt 프론트엔드 모델 선택 - [X] chatgpt 프론트엔드 사용자 정의 모델, 대화 수, 응답 수 지원 - [X] chatgpt 이미지 업로드 지원 gpt-4-vision-preview 사용 - [X] chatgpt 파일 백엔드 업로드 지원(gpt-4-all, gpt-4-gizmo-xxx 모델) 기본적으로 비활성화됨, 활성화하려면 환경 변수 API_UPLOADER=1 필요 - [X] chatgpt 역모델 지원 gpt-4-all, gpt-4-v, gpt-4-gizmo-(gizmo_id) - [X] chatgpt 초링크 모델 전환 지원 https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] ChatGPT 실시간 초링크 모델 전환 지원 https://chat.openai.com/g/g-2fkFE8rbu를 https://vercel.ddaiai.com/#/g/g-2fkFE8rbu로 변경 - [X] chatgpt GPTs 다중 모드 지원 - [X] chatgpt tts whisper 지원 - [X] 즉시 음성 인식(브라우저 기본 음성 인식 ASR) `v2.15.7` 이상 버전 - [X] 초링크 설정 변경 지원, `one-api`, `new-api` 배포 채팅에 적합 https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] `one-api`, `new-api` 배포 채팅 지원 https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## 서버리스 - 개인 데스크탑 설치 > - [x] https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases에서 최신 버전 다운로드(운영 체제에 적합한 버전 선택) > - [x] 적합한 중계 서비스 제공업체 선택(`gpt`, `gpts`, `midjourney`, `claude`, `suno`를 모두 지원하는 것이 좋음) > - [x] 중계 서비스 제공업체 추천 https://www.openai-hk.com 하나의 `key`와 `api 인터페이스 주소` 동시에 `gpt`, `midjourney`, `claude`, `suno` 지원, mj-fast 최소 0.12rmb/장 ![다중 모드](./docs/suno-ds.jpg) ## Vercel 원클릭 배포 [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## env 환경 변수 | 환경 변수 | 설명 | 기본값 |docker 등 배포| vercel 배포| | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | OpenAI API 인터페이스 주소 | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | OpenAI API 키 | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | 기본 모델 | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | mj 프록시 인터페이스 주소 |[구축 참고](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | mj 프록시 | 비어 있음 | ✅ | ✅| | SUNO_SERVER | SUNO API 인터페이스 주소 | [구축 참고](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | SUNO API 키 | 비어 있음 | ✅ | ✅| | AUTH_SECRET_KEY | 접근 권한 암호 | 없음 | ✅ | x| | API_UPLOADER | 업로드 지원 | 비활성화됨 | ✅ | x| | HIDE_SERVER | 프론트엔드 UI 서버 숨김 | | ✅ | x| | CUSTOM_MODELS | 사용자 정의 선택 가능한 모델 | 없음 | ✅ | ✅| | TJ_BAIDU_ID | Baidu 통계 ID | 없음 | ✅ | ✅| | TJ_GOOGLE_ID | Google 통계 ID | 없음 | ✅ | ✅| | SYS_NOTIFY | 시스템 알림, HTML 지원 | 없음 | ✅ | ✅| | DISABLE_GPT4 | GPT-4 비활성화 | 없음 | ✅ | ✅| | GPT_URL | 사용자 정의 GPT_URL=/gpts.json | 없음, 외부 링크도 가능 | ✅ | ✅| | UPLOAD_IMG_SIZE | gpt4v 업로드 이미지 크기 | 1 | ✅ | ✅| | SYS_THEME | 기본 테마 `light` 또는 `dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | `wsrv` 이미지 서버 활성화 여부 | 비활성화 | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | 폭파 방지 검증: 검증 횟수 NGINX 설정 `proxy_set_header X-Forwarded-For $remote_addr` | 없음 | ✅ | x| | AUTH_SECRET_ERROR_TIME | 폭파 방지 검증: 대기 시간 단위 분 | 없음 | ✅ | x| | CLOSE_MD_PREVIEW | 입력 미리보기 비활성화 | 없음 | ✅ | ✅| | UPLOAD_TYPE | 업로드 방식 지정 [`R2` R2 업로드] [`API` UI 프론트엔드 중계] [`Container` 로컬 컨테이너] [`MyUrl` 사용자 정의 링크] | 비어 있음 | ✅ | x| | MENU_DISABLE | 메뉴 비활성화 옵션: gpts, draws, gallery, music | 비어 있음 | ✅ | ✅| | VISION_MODEL | 기본 사용 이미지 인식 모델: `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview` 등 | 비어 있음 | ✅ | ✅| | SYSTEM_MESSAGE | 사용자 정의 기본 역할 메시지 | 비어 있음 | ✅ | ✅| | CUSTOM_VISION_MODELS | 사용자 정의 이미지 인식 모델, 쉼표로 구분 | 비어 있음 | ✅ | ✅| ## docker 배포 > - [x] [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 지원 필요 > - [x] [Suno-API](https://github.com/SunoAI-API/Suno-API) 지원 필요 ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` 접속 http://ip:6015 **파일 업로드**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` 프론트엔드 UI에서 OPENAI_API_KEY OPENAI_API_BASE_URL 설정 시; 이미지 업로드도 OPENAI_API_BASE_URL로 진행 ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` 반환 형식 ```json { "url":"https://xxxxxxx.jpg" } ``` ### midjourney-proxy API docker 배포 자세한 내용은 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 오픈 소스를 참조 ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=discord 서비스 ID \ -e mj.discord.channel-id=discord 서비스 그룹 ID \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## 더 많은 예시 ### 사용자 정의 서버 API 키, base_url: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![다중 모드](./docs/gpts.jpg) ![다중 모드](./docs/gpts1.jpg) ### suno 음악 제작 ![suno](./docs/suno.jpg) ### 녹음 whisper와 tts ![whisper--tts](./docs/tts-whisper.png) ### 부분 재그리기: [![부분 재그리기](./docs/mj2.jpg)](./docs/mj2.jpg) ### 얼굴 교체 ![얼굴 교체](./docs/mj2a2.jpg) ### 이미지 합성 ![이미지 합성](./docs/mj2a3.jpg) ### gpt-4-vision-preview 사용을 위한 이미지 업로드 지원 ![이미지 합성](./docs/mj4a1.png) 모바일:
## 파일 업로드 Cloudflare R2 저장소 지원 - Cloudflare R2 저장소 10 GB/월 무료 https://www.cloudflare.com/ko-kr/developer-platform/r2/ - 구성 문서 참고 https://zhuanlan.zhihu.com/p/658058503 - Vercel은 R2 저장소를 지원하지 않음 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## 파일 서버 요청 우선순위 R2 > 프론트엔드 UI 설정 파일 서버 > 백엔드 파일 서버 > 중계 ## 폭파 방지 검증 설정 ![폭파 방지](./docs/check_error.jpg) - [x] Vercel은 지원하지 않음; Docker 배포만 지원 - [x] 앞에 `nginx`를 장착한 경우 `proxy_set_header X-Forwarded-For $remote_addr;` 설정 필요 - [x] 매개변수는 다음과 같음: 3회 검증 오류 시 10분 후에만 다시 검증 가능 ```yml # 암호 주의: 영어 + 숫자만 사용 AUTH_SECRET_KEY=my888god #폭파: 검증 횟수 주의: 숫자; nginx 설정 proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 #폭파: 검증 대기 시간 단위 분 주의: 숫자 AUTH_SECRET_ERROR_TIME=10 ``` - [x] 스크립트는 다음과 같음 ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=your_english_password -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` ## 라이센스 MIT © [Dooy](./license) ## 기타 이 프로젝트가 유용하다고 생각되면 star를 주거나 후원을 부탁드립니다 [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## 후원 제 오픈 소스 프로젝트가 도움이 되었다면, 아래 방법 중 하나로 후원을 고려해 주세요:
`결제 메모에 연락처를 남겨 주세요`
WeChat 후원
Alipay 후원
================================================ FILE: README_RU.md ================================================ # ChatGPT Web Midjourney Proxy 💡**Заявление** - Этот проект опубликован только на GitHub, основан на лицензии MIT, бесплатен и предназначен для использования в качестве учебного ресурса с открытым исходным кодом. Не предусмотрены никакие формы продажи аккаунтов, платных услуг, обсуждательных групп и т.д. Остерегайтесь мошенничества. - Этот проект создан на основе [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web); используется midjourney API, предоставляемый [midjourney-proxy](https://github.com/novicezk/midjourney-proxy), и [Suno-API](https://github.com/SunoAI-API/Suno-API) в качестве backend. ![cover](./docs/mj2a1.jpg) ## Поддерживаемые функции - [x] Поддержка отдельного модуля suno, регулировка текста песни, изменение стиля музыки - [x] Все функции оригинального chatgpt web - [x] Chatgpt web поддерживает настраиваемый api key и base_url - [x] Midjourney генерация изображений по тексту - [x] Midjourney создание изображений по тексту и изображению - [X] Midjourney U1-U4, V1-V4, перерисовка и другие действия - [X] Midjourney поддержка частичной перерисовки - [X] Midjourney поддержка увеличения в 1.5 раза, в 2 раза - [X] Midjourney поддержка 2x HD, 4x HD - [X] Midjourney поддержка изменения влево, вправо, вверх, вниз - [X] Midjourney поддержка [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) и [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) - [X] Midjourney генерация текста по изображению - [X] Локальное хранение изображений с использованием localforage - [X] Поддержка различных ботов midjourney, niji - [X] Поддержка [InsightFace замена лица](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] Midjourney смешивание изображений - [X] Midjourney получение seed - [X] DALL-E-3 генерация изображений - [X] Выбор модели на frontend chatgpt - [X] Поддержка пользовательских моделей, количества контекстных диалогов, количества ответов на frontend chatgpt - [X] Поддержка загрузки изображений для gpt-4-vision-preview - [X] Поддержка загрузки файлов на backend (для моделей gpt-4-all, gpt-4-gizmo-xxx). По умолчанию отключено, для включения требуется переменная окружения API_UPLOADER=1 - [X] Поддержка обратных моделей gpt-4-all, gpt-4-v, gpt-4-gizmo-(gizmo_id) - [X] Поддержка переключения гиперссылок на модели https://vercel.ddaiai.com/#/m/gpt-4-all, https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] Поддержка переключения гиперссылок на модели ChatGPT https://chat.openai.com/g/g-2fkFE8rbu на https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] Поддержка ChatGPT с несколькими модальностями GPTs - [X] Поддержка tts whisper - [X] Мгновенное распознавание речи (ASR браузера) `v2.15.7` и выше - [X] Поддержка изменения настроек гиперссылок, подходящих для деплоя `one-api`, `new-api` чата https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] Поддержка деплоя `one-api`, `new-api` чата https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## Установка на рабочем столе без сервера > - [x] Перейдите по ссылке https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases и скачайте последнюю версию (выберите версию, подходящую для вашей операционной системы) > - [x] Выберите подходящего провайдера прокси-сервера (лучше всего, чтобы он поддерживал `gpt`, `gpts`, `midjourney`, `claude`, `suno`) > - [x] Рекомендуемый провайдер прокси-сервера https://www.openai-hk.com, один `key` и `api интерфейс`, поддерживающий одновременно `gpt`, `midjourney`, `claude`, `suno`, mj-fast от 0.12rmb/изображение ![многомодальность](./docs/suno-ds.jpg) ## Однократное развертывание Vercel [![Развернуть с Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## Переменные окружения | Переменная окружения | Описание | Значение по умолчанию | docker и другие развертывания | развертывание vercel | | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | Адрес OpenAI API | https://api.openai.com | ✅ | ✅ | | OPENAI_API_KEY | Ключ OpenAI API | sk-xxxxx | ✅ | ✅ | | OPENAI_API_MODEL | Модель по умолчанию | gpt-3.5-turbo | ✅ | ✅ | | MJ_SERVER | Адрес midjourney proxy API | [Инструкция по установке](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅ | | MJ_API_SECRET | Секретный ключ midjourney proxy | пусто | ✅ | ✅ | | SUNO_SERVER | Адрес SUNO API | [Инструкция по установке](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅ | | SUNO_KEY | Ключ SUNO API | пусто | ✅ | ✅ | | AUTH_SECRET_KEY | Пароль для доступа | нет | ✅ | x | | API_UPLOADER | Поддержка загрузки | отключено | ✅ | x | | HIDE_SERVER | Скрыть сервер в интерфейсе | нет | ✅ | x | | CUSTOM_MODELS | Настраиваемые модели | нет | ✅ | ✅ | | TJ_BAIDU_ID | ID статистики Baidu | нет | ✅ | ✅ | | TJ_GOOGLE_ID | ID статистики Google | нет | ✅ | ✅ | | SYS_NOTIFY | Системные уведомления, поддержка HTML | нет | ✅ | ✅ | | DISABLE_GPT4 | Отключить GPT-4 | нет | ✅ | ✅ | | GPT_URL | URL для кастомных моделей GPT | нет | ✅ | ✅ | | UPLOAD_IMG_SIZE | Максимальный размер загружаемого изображения для gpt4v | 1 | ✅ | ✅ | | SYS_THEME | Тема по умолчанию `light` или `dark` | dark | ✅ | ✅ | | MJ_IMG_WSRV | Включить wsrv для изображений | нет | ✅ | ✅ | | AUTH_SECRET_ERROR_COUNT | Количество попыток для защиты от перебора паролей | нет | ✅ | x | | AUTH_SECRET_ERROR_TIME | Время блокировки при защите от перебора паролей (в минутах) | нет | ✅ | x | | CLOSE_MD_PREVIEW | Отключить предпросмотр Markdown | нет | ✅ | ✅ | | UPLOAD_TYPE | Метод загрузки: [`R2` R2 загрузка], [`API` через frontend UI], [`Container` локальное], [`MyUrl` кастомный URL] | пусто | ✅ | x | | MENU_DISABLE | Отключение меню: gpts,draws,gallery,music | пусто | ✅ | ✅ | | VISION_MODEL | Модель для распознавания изображений: `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview` | пусто | ✅ | ✅ | | SYSTEM_MESSAGE | Кастомное сообщение по умолчанию | пусто | ✅ | ✅ | | CUSTOM_VISION_MODELS | Кастомные модели для распознавания изображений, разделенные запятыми | пусто | ✅ | ✅ | ## Развертывание с помощью Docker > - [x] Требуется поддержка [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) > - [x] Требуется поддержка [Suno-API](https://github.com/SunoAI-API/Suno-API) ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` Доступ по адресу http://ip:6015 **Загрузка файлов**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` Если в интерфейсе установлены OPENAI_API_KEY и OPENAI_API_BASE_URL; загрузка изображений будет следовать за OPENAI_API_BASE_URL ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` Возвращаемый формат ```json { "url":"https://xxxxxxx.jpg" } ``` ### Развертывание midjourney-proxy API через Docker Дополнительные инструкции смотрите на [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=ID сервера discord \ -e mj.discord.channel-id=ID канала discord \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## Дополнительные примеры ### Кастомный api key и base_url для сервера: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![многомодальность](./docs/gpts.jpg) ![многомодальность](./docs/gpts1.jpg) ### Создание музыки с помощью suno ![suno](./docs/suno.jpg) ### Запись и tts whisper ![whisper--tts](./docs/tts-whisper.png) ### Частичная перерисовка: [![Частичная перерисовка](./docs/mj2.jpg)](./docs/mj2.jpg) ### Замена лица ![Замена лица](./docs/mj2a2.jpg) ### Смешивание изображений ![Смешивание изображений](./docs/mj2a3.jpg) ### Загрузка изображений для gpt-4-vision-preview ![Загрузка изображений](./docs/mj4a1.png) На мобильных устройствах:
## Загрузка файлов с поддержкой cloudflare r2 - cloudflare r2 до 10 ГБ в месяц бесплатно https://www.cloudflare.com/zh-cn/developer-platform/r2/ - Инструкции по настройке https://zhuanlan.zhihu.com/p/658058503 - Vercel не поддерживает r2 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## Приоритет запросов на файловый сервер R2> Настройки файлового сервера в UI> Сервис backend > прокси ## Защита от перебора паролей ![Защита от перебора паролей](./docs/check_error.jpg) - [x] Vercel не поддерживает; поддержка только для развертывания Docker - [x] Если используется nginx, настройте `proxy_set_header X-Forwarded-For $remote_addr;` - [x] Пример настроек: 3 попытки, блокировка на 10 минут ```yml # Секретный ключ: только латиница и цифры AUTH_SECRET_KEY=my888god # Защита от перебора: количество попыток AUTH_SECRET_ERROR_COUNT=3 # Защита от перебора: время блокировки в минутах AUTH_SECRET_ERROR_TIME=10 ``` - [x] Пример скрипта ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=ваш_секретный_ключ -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` ## Лицензия MIT © [Dooy](./license) ## Прочее Если вы считаете, что этот проект был вам полезен, пожалуйста, поставьте звезду или сделайте пожертвование [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## Пожертвования Если мои проекты с открытым исходным кодом помогли вам, пожалуйста, рассмотрите возможность сделать пожертвование:
`Укажите ваши контактные данные в примечании к платежу`
Пожертвование через WeChat
Пожертвование через Alipay
================================================ FILE: README_TR.md ================================================ # ChatGPT Web Midjourney Proxy 💡**Beyan** - Bu proje sadece GitHub'da yayımlanmaktadır, MIT lisansı altında ücretsiz ve açık kaynak öğrenimi amacıyla kullanılmaktadır. Hiçbir şekilde hesap satışı, ücretli hizmet, tartışma grubu veya tartışma odası gibi faaliyetler bulunmamaktadır. Dolandırıcılıklara karşı dikkatli olun. - Bu açık kaynak proje, [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web) temel alınarak geliştirilmiştir; [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) tarafından sağlanan midjourney api ve [Suno-API](https://github.com/SunoAI-API/Suno-API) arka uç olarak kullanılmıştır; ![cover](./docs/mj2a1.jpg) ## Desteklenen Özellikler - [x] suno tek başına modül desteği, şarkı sözleri ve müzik tarzı ayarlama - [x] Orijinal chatgpt web tüm özellikleri - [x] chatgpt web özel api key, base_url desteği - [x] midjourney metinden görüntü oluşturma - [x] midjourney görüntü üzerine metin ekleme - [X] midjourney görüntü değişiklikleri U1'den U4'e, V1'den V4'e ve yeniden çizim gibi işlemler - [X] midjourney yerel yeniden çizim desteği - [X] midjourney 1.5x ve 2x yakınlaştırma desteği - [X] midjourney 2x ve 4x yüksek çözünürlük desteği - [X] midjourney sola, sağa, yukarıya, aşağıya uzantı değişiklikleri - [X] midjourney aynı anda [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) ve [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) arayüzlerini destekler - [X] midjourney görüntüden metin oluşturma - [X] Görüntülerin yerel depolama için localforage kullanımı - [X] midjourney ve niji farklı botları destekler - [X] [InsightFace yüz değiştirme](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) desteği - [X] midjourney görüntü karıştırma - [X] midjourney seed alma - [X] dall-e-3 çizim - [X] chatgpt ön uç model seçimi - [X] chatgpt ön uç özel model, sohbet sayısı, yanıt sayısı desteği - [X] chatgpt görüntü yükleme ve gpt-4-vision-preview kullanımı - [X] chatgpt dosya yükleme desteği (gpt-4-all, gpt-4-gizmo-xxx modelleri için)! Varsayılan olarak kapalıdır, açmak için API_UPLOADER=1 ortam değişkenine ihtiyaç vardır - [X] chatgpt tersine modeller gpt-4-all, gpt-4-v, gpt-4-gizmo-(gizmo_id) desteği - [X] chatgpt super link model değiştirme https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu desteği - [X] ChatGPT super link model değiştirme desteği https://chat.openai.com/g/g-2fkFE8rbu https://vercel.ddaiai.com/#/g/g-2fkFE8rbu olarak değiştirilebilir - [X] chatgpt GPTs multi-modal desteği - [X] chatgpt tts whisper desteği - [X] Anında ses tanıma (tarayıcıda yerleşik ses tanıma ASR) `v2.15.7` üzeri sürümler - [X] one-api ve new-api dağıtım sohbeti için super link değiştirme https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] one-api ve new-api dağıtım sohbeti https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## Sunucusuz-Kişisel Masaüstü Kurulumu > - [x] En son sürümü indirmek için https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases adresine gidin (işletim sisteminize uygun sürümü seçin) > - [x] Uygun bir ara sunucu hizmeti seçin (tercihen `gpt`, `gpts`, `midjourney`, `claude`, `suno` destekleyen) > - [x] Ara sunucu hizmet sağlayıcıları önerisi https://www.openai-hk.com bir `key` ve `api arayüz adresi` aynı anda `gpt`, `midjourney`, `claude`, `suno` destekler, mj-fast en düşük 0.12rmb/adet ![multi-modal](./docs/suno-ds.jpg) ## Vercel Tek Tıklama ile Dağıtım [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## env Ortam Değişkenleri | Ortam Değişkeni | Açıklama | Varsayılan Değer |docker gibi dağıtımlar| vercel dağıtımı| | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | OpenAI API arayüz adresi | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | OpenAI API anahtarı | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | Varsayılan model | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | mj proxy arayüz adresi |[Kurulum Referansı](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | mj proxy | Boş | ✅ | ✅| | SUNO_SERVER | SUNO API arayüz adresi | [Kurulum Referansı](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | SUNO API anahtarı | Boş | ✅ | ✅| | AUTH_SECRET_KEY | Erişim yetkilendirme şifresi | Yok | ✅ | x| | API_UPLOADER | Yükleme desteği | Kapalı | ✅ | x| | HIDE_SERVER | Ön uç arayüzü sunucu gizle | | ✅ | x| | CUSTOM_MODELS | Özel seçilebilir modeller | Yok | ✅ | ✅| | TJ_BAIDU_ID | Baidu İstatistik ID | Yok | ✅ | ✅| | TJ_GOOGLE_ID | Google İstatistik ID | Yok | ✅ | ✅| | SYS_NOTIFY | Sistem bildirimi, HTML destekler | Yok | ✅ | ✅| | DISABLE_GPT4 | GPT-4 devre dışı bırakma | Yok | ✅ | ✅| | GPT_URL | Özelleştir GPT_URL=/gpts.json | Yok, ayrıca kendi harici linkinizi de kullanabilirsiniz | ✅ | ✅| | UPLOAD_IMG_SIZE | gpt4v görüntü yükleme boyutu | 1 | ✅ | ✅| | SYS_THEME | Varsayılan tema `light` veya `dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | `wsrv` resim sunucu açılışı | Yok (kapalı) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | Bruteforce koruması: doğrulama sayısı NGINX lütfen `proxy_set_header X-Forwarded-For $remote_addr` ayarlayın | Yok | ✅ | x| | AUTH_SECRET_ERROR_TIME | Bruteforce koruması: bekleme süresi dakika cinsinden | Yok | ✅ | x| | CLOSE_MD_PREVIEW | Giriş önizlemesini kapat | Yok | ✅ | ✅| | UPLOAD_TYPE | Yükleme türü [`R2` R2 yükleme] [`API` UI ön uçla ara sunucu] [`Container` yerel konteyner] [` MyUrl` özel link] | Boş | ✅ | x| | MENU_DISABLE | Menü devre dışı bırakılacak seçenekler: gpts,draws,gallery,music | Boş | ✅ | ✅| | VISION_MODEL | Varsayılan görüntü modeli seçenekleri: `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview` vb. | Boş | ✅ | ✅| | SYSTEM_MESSAGE | Varsayılan özel rol mesajı | Boş | ✅ | ✅| | CUSTOM_VISION_MODELS | Özel görüntü modelleri, virgülle ayrılmış | Boş | ✅ | ✅| ## docker Dağıtımı > - [x] [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) desteği gereklidir > - [x] [Suno-API](https://github.com/SunoAI-API/Suno-API) desteği gereklidir ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=your-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` Erişim http://ip:6015 **Dosya Yükleme**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` Ön uç arayüzde OPENAI_API_KEY ve OPENAI_API_BASE_URL ayarlandığında; resim yükleme de OPENAI_API_BASE_URL üzerinden yürütülecektir ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` Dönüş Formatı ```json { "url":"https://xxxxxxx.jpg" } ``` ### midjourney-proxy API docker dağıtımı Daha fazla bilgi için [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) açık kaynak referansını ziyaret edin ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=discord hizmeti ID \ -e mj.discord.channel-id=discord hizmet grubu ID \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## Daha Fazla Gösterim ### Özel sunucu api key, base_url: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Mağaza ![multi-modal](./docs/gpts.jpg) ![multi-modal](./docs/gpts1.jpg) ### suno Müzik Yapımı ![suno](./docs/suno.jpg) ### Ses Kaydı whisper ve tts ![whisper--tts](./docs/tts-whisper.png) ### Yerel yeniden çizim: [![Yerel yeniden çizim](./docs/mj2.jpg)](./docs/mj2.jpg) ### Yüz Değiştirme ![Yüz Değiştirme](./docs/mj2a2.jpg) ### Görüntü Karıştırma ![Görüntü Karıştırma](./docs/mj2a3.jpg) ### Görüntü yükleme ve gpt-4-vision-preview kullanımı ![Görüntü](./docs/mj4a1.png) Mobil:
## Dosya Yükleme Cloudflare R2 Depolama Desteği - Cloudflare R2 depolama 10 GB/ay ücretsiz https://www.cloudflare.com/zh-cn/developer-platform/r2/ - Konfigürasyon dokümanı için https://zhuanlan.zhihu.com/p/658058503 adresine bakın - vercel R2 depolamayı desteklemez ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## Dosya Sunucusu Talep Öncelik Sırası R2> Ön uç arayüzde belirlenen dosya hizmeti> Arka uç dosya hizmeti > ara sunucu ## Bruteforce Koruma Ayarları ![Bruteforce](./docs/check_error.jpg) - [x] vercel desteklemez; sadece Docker dağıtımı destekler - [x] Eğer ön tarafta `nginx` kullanılıyorsa lütfen `proxy_set_header X-Forwarded-For $remote_addr;` ayarlayın - [x] Parametreler: 3 kez yanlış doğrulama yapılırsa, 10 dakika boyunca tekrar doğrulama yapılamaz ```yml # Secret key Not: Sadece İngilizce harf ve rakam kullanın AUTH_SECRET_KEY=my888god # Bruteforce: doğrulama sayısı Not: Rakam olmalıdır; nginx lütfen `proxy_set_header X-Forwarded-For $remote_addr` ayarlayın AUTH_SECRET_ERROR_COUNT=3 # Bruteforce: bekleme süresi dakika cinsinden Not: Rakam olmalıdır AUTH_SECRET_ERROR_TIME=10 ``` - [x] Betik ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=ingilizce_sifreniz -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` ## Lisans MIT © [Dooy](./license) ## Diğerleri Eğer bu proje size yardımcı olduysa, lütfen bir yıldız verin veya bizi bağışlayın [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## Bağış Eğer açık kaynak projelerim size yardımcı olduysa, lütfen aşağıdaki yöntemlerden biriyle bağış yapmayı düşünün:
`Ödeme notunda iletişim bilgilerinizi belirtin`
WeChat Bağışı
Alipay Bağışı
================================================ FILE: README_VN.md ================================================ # ChatGPT Web Midjourney Proxy 💡**Tuyên bố** - Dự án này chỉ phát hành trên GitHub, dựa trên giấy phép MIT, miễn phí và sử dụng cho mục đích học tập mã nguồn mở. Không có bất kỳ hình thức bán tài khoản, dịch vụ trả phí, nhóm thảo luận, nhóm thảo luận nào khác. Hãy cảnh giác với lừa đảo. - Mã nguồn mở này được phát triển lại dựa trên [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web) và sử dụng midjourney api do [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) cung cấp và [Suno-API](https://github.com/SunoAI-API/Suno-API) làm backend. ![cover](./docs/mj2a1.jpg) ## Chức năng hỗ trợ - [x] Hỗ trợ module riêng biệt Suno, có thể điều chỉnh lời bài hát và phong cách âm nhạc - [x] Tất cả các chức năng của chatgpt web gốc - [x] chatgpt web hỗ trợ API key tùy chỉnh, base_url - [x] Midjourney sinh hình từ văn bản - [x] Midjourney vẽ từ hình + văn bản - [X] Midjourney biến hình từ U1 đến U4, V1 đến V4, và các thao tác vẽ lại khác - [X] Midjourney hỗ trợ vẽ lại từng phần - [X] Midjourney hỗ trợ zoom 1.5x, 2x - [X] Midjourney hỗ trợ HD 2x, HD 4x - [X] Midjourney hỗ trợ mở rộng trái, phải, trên, dưới - [X] Midjourney hỗ trợ cả hai giao diện [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) và [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) - [X] Midjourney sinh văn từ hình ảnh - [X] Sử dụng localforage để lưu trữ hình ảnh cục bộ - [X] Hỗ trợ các robot khác nhau của Midjourney và Niji - [X] Hỗ trợ [InsightFace thay thế khuôn mặt](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] Midjourney trộn hình ảnh - [X] Midjourney lấy seed - [X] Dall-e-3 vẽ hình ảnh - [X] Chatgpt chọn mô hình ở giao diện trước - [X] Chatgpt hỗ trợ mô hình tùy chỉnh, số lượng đối thoại theo ngữ cảnh, số lượng trả lời - [X] Chatgpt hỗ trợ tải ảnh để sử dụng GPT-4-Vision-Preview - [X] Chatgpt hỗ trợ tải lên file backend (dành cho các mô hình GPT-4-All, GPT-4-Gizmo-XXX)! Mặc định là tắt, mở cần biến môi trường API_UPLOADER=1 - [X] Chatgpt hỗ trợ mô hình đảo ngược GPT-4-All, GPT-4-V, GPT-4-Gizmo-(gizmo_id) - [X] Chatgpt hỗ trợ chuyển đổi mô hình liên kết https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] Hỗ trợ chuyển đổi mô hình liên kết thử nghiệm của ChatGPT https://chat.openai.com/g/g-2fkFE8rbu sửa thành https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] Chatgpt hỗ trợ GPTs đa modal - [X] Chatgpt hỗ trợ tts whisper - [X] Nhận diện giọng nói ngay lập tức (Nhận diện giọng nói sẵn có của trình duyệt ASR) `v2.15.7` trở lên - [X] Hỗ trợ thay đổi thiết lập liên kết, phù hợp với `one-api`, `new-api` triển khai chat https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] Hỗ trợ triển khai chat `one-api`, `new-api` https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## Cài đặt trên máy cá nhân - không máy chủ > - [x] Vui lòng tải phiên bản mới nhất từ https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases (chọn phiên bản phù hợp với hệ điều hành của bạn) > - [x] Chọn một nhà cung cấp dịch vụ trung chuyển phù hợp (Tốt nhất là hỗ trợ `gpt`, `gpts`, `midjourney`, `claude`, `suno`) > - [x] Nhà cung cấp dịch vụ trung chuyển đề xuất https://www.openai-hk.com với một `key` và `địa chỉ API` hỗ trợ cùng lúc `gpt`, `midjourney`, `claude`, `suno`, mj-fast thấp nhất chỉ 0.12rmb/hình ảnh ![đa modal](./docs/suno-ds.jpg) ## Vercel triển khai một lần nhấn [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## Biến môi trường env | Biến môi trường | Mô tả | Giá trị mặc định | triển khai docker| triển khai vercel| | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | Địa chỉ API OpenAI | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | Khóa API OpenAI | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | Mô hình mặc định | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | Địa chỉ giao diện proxy mj |[tham khảo cài đặt](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | mj proxy | Trống | ✅ | ✅| | SUNO_SERVER | Địa chỉ API SUNO | [tham khảo cài đặt](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | Khóa API SUNO | Trống | ✅ | ✅| | AUTH_SECRET_KEY | Mật khẩu truy cập | Không có | ✅ | x| | API_UPLOADER | Hỗ trợ tải lên | Tắt | ✅ | x| | HIDE_SERVER | Ẩn server trong giao diện trước | | ✅ | x| | CUSTOM_MODELS | Mô hình tùy chỉnh | Không có | ✅ | ✅| | TJ_BAIDU_ID | ID thống kê Baidu | Không có | ✅ | ✅| | TJ_GOOGLE_ID | ID thống kê Google | Không có | ✅ | ✅| | SYS_NOTIFY | Thông báo hệ thống, hỗ trợ HTML | Không có | ✅ | ✅| | DISABLE_GPT4 | Vô hiệu hóa GPT-4 | Không có | ✅ | ✅| | GPT_URL | URL GPT tùy chỉnh =/gpts.json | Không có hoặc liên kết ngoài của bạn | ✅ | ✅| | UPLOAD_IMG_SIZE | Kích thước tải lên ảnh gpt4v | 1 | ✅ | ✅| | SYS_THEME | Chủ đề mặc định `light` hoặc `dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | Có bật `wsrv` làm máy chủ hình ảnh không | Không (tắt) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | Số lần xác minh lỗi để tránh brute force NGINX xin vui lòng thiết lập `proxy_set_header X-Forwarded-For $remote_addr` | Không có | ✅ | x| | AUTH_SECRET_ERROR_TIME | Thời gian dừng lại khi xác minh lỗi đơn vị phút | Không có | ✅ | x| | CLOSE_MD_PREVIEW | Có tắt xem trước đầu vào không | Không có | ✅ | ✅| | UPLOAD_TYPE | Chỉ định cách tải lên [`R2` tải lên R2] [`API` trung chuyển UI] [`Container` container cục bộ] [`MyUrl` liên kết tùy chỉnh] | Trống | ✅ | x| | MENU_DISABLE | Menu vô hiệu hóa tùy chọn: gpts, draws, gallery, music | Trống | ✅ | ✅| | VISION_MODEL | Mô hình nhận diện mặc định tùy chọn: `gpt-4o`, `gpt-4-turb`, `gpt-4-vision-preview` | Trống | ✅ | ✅| | SYSTEM_MESSAGE | Tin nhắn nhân vật mặc định tùy chỉnh | Trống | ✅ | ✅| | CUSTOM_VISION_MODELS | Mô hình nhận diện tùy chỉnh cách nhau bởi dấu phẩy | Trống | ✅ | ✅| ## Triển khai docker > - [x] Cần [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) hỗ trợ > - [x] Cần [Suno-API](https://github.com/SunoAI-API/Suno-API) hỗ trợ ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` Truy cập http://ip:6015 **Tải lên tệp:** ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` Nếu thiết lập UI trước OPENAI_API_KEY OPENAI_API_BASE_URL; tải lên hình ảnh sẽ theo OPENAI_API_BASE_URL ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` Kết quả trả về ```json { "url":"https://xxxxxxx.jpg" } ``` ### API midjourney-proxy triển khai docker Tham khảo thêm tại [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=ID dịch vụ discord \ -e mj.discord.channel-id=ID nhóm dịch vụ discord \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## Hình ảnh thêm ### API key và base_url tùy chỉnh ở giao diện trước: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![đa modal](./docs/gpts.jpg) ![đa modal](./docs/gpts1.jpg) ### Sản xuất âm nhạc Suno ![suno](./docs/suno.jpg) ### Ghi âm whisper và tts ![whisper--tts](./docs/tts-whisper.png) ### Vẽ lại từng phần: [![Vẽ lại từng phần](./docs/mj2.jpg)](./docs/mj2.jpg) ### Thay đổi khuôn mặt ![Thay đổi khuôn mặt](./docs/mj2a2.jpg) ### Trộn hình ảnh ![Trộn hình ảnh](./docs/mj2a3.jpg) ### Hỗ trợ tải lên hình ảnh cho gpt-4-vision-preview ![Trộn hình ảnh](./docs/mj4a1.png) Trên điện thoại:
## Tải lên tệp hỗ trợ lưu trữ cloudflare r2 - Lưu trữ cloudflare r2 10 GB/tháng miễn phí https://www.cloudflare.com/zh-cn/developer-platform/r2/ - Tài liệu cấu hình tham khảo https://zhuanlan.zhihu.com/p/658058503 - Vercel không hỗ trợ lưu trữ r2 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## Ưu tiên yêu cầu máy chủ tệp R2> Thiết lập dịch vụ tệp UI phía trước > Dịch vụ tệp backend > theo trung chuyển ## Thiết lập xác minh tránh brute force ![Xác minh tránh brute force](./docs/check_error.jpg) - [x] Vercel không hỗ trợ; chỉ hỗ trợ triển khai docker - [x] Nếu đằng trước gắn `nginx` vui lòng cấu hình `proxy_set_header X-Forwarded-For $remote_addr;` - [x] Các tham số như sau: lỗi xác minh 3 lần, chỉ có thể xác minh lại sau 10 phút ```yml # Secret key chú ý: Chỉ có chữ cái tiếng Anh + số AUTH_SECRET_KEY=my888god # Brute force: số lần xác minh lỗi chú ý: số ;nginx vui lòng thiết lập proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 # Brute force: thời gian dừng lại đơn vị phút chú ý: là số AUTH_SECRET_ERROR_TIME=10 ``` - [x] Kịch bản như sau ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=mật khẩu tiếng Anh của bạn -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` - ## License MIT © [Dooy](./license) ## Khác Nếu bạn thấy dự án này hữu ích, hãy giúp tôi bằng cách đánh giá sao hoặc ủng hộ chúng tôi [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## Ủng hộ Nếu mã nguồn mở của tôi hữu ích với bạn, vui lòng xem xét ủng hộ qua bất kỳ phương thức nào sau đây:
`Ghi chú liên hệ của bạn trên thanh toán`
Ủng hộ WeChat
Ủng hộ Alipay
================================================ FILE: README_ZH.md ================================================ # ChatGPT Web Midjourney Proxy 💡**声明** - 此项目只发布于 GitHub,基于 MIT 协议,免费且作为开源学习使用。并且不会有任何形式的卖号、付费服务、讨论群、讨论组等行为。谨防受骗。 - 本开源是在 [ChenZhaoYu](https://github.com/Chanzhaoyu/chatgpt-web) 基础上做二次开发 ;使用 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 提供的midjourney api和 [Suno-API](https://github.com/SunoAI-API/Suno-API) 作为后端而形成的; ![cover](./docs/mj2a1.jpg) ## 支持功能 - [x] 支持 suno 单独模块,可歌词调整 曲风调整 - [x] 原chatgpt web 所有功能 - [x] chatgpt web 支持自定义api key、base_url - [x] midjourney 文生图 - [x] midjourney 垫图+文生图 - [X] midjourney 图变 U1到U4 、 V1到V4、重绘等操作 - [X] midjourney 支持局部重绘 - [X] midjourney 支持1.5倍变焦 2倍变焦 - [X] midjourney 支持2倍高清 4倍高清 - [X] midjourney 支持左、右、上、下延伸变化 - [X] midjourney 同时支持[midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 接口 和 [midjourney-proxy-plus](https://github.com/litter-coder/midjourney-proxy-plus) 接口 - [X] midjourney 图生文 - [X] 图片使用localforage实现本地存储 - [X] 支持midjourney、niji 不同机器人 - [X] 支持[InsightFace 人脸替换](https://discord.com/api/oauth2/authorize?client_id=1090660574196674713&permissions=274877945856&scope=bot) - [X] midjourney 混图 - [X] midjourney 获取 seed - [X] dall-e-3 画图 - [X] chatgpt 前端选择模型 - [X] chatgpt 前端支持自定义模型、上下文对话数、回复数 - [X] chatgpt 支持图片上传图片 供gpt-4-vision-preview使用 - [X] chatgpt 支持文件后端上传(供给gpt-4-all gpt-4-gizmo-xxx 模型)! 默认是关闭的 打开需要环境变量 API_UPLOADER=1 - [X] chatgpt 支持逆向模型 gpt-4-all gpt-4-v gpt-4-gizmo-(gizmo_id) - [X] chatgpt 支持超链模型切换 https://vercel.ddaiai.com/#/m/gpt-4-all https://vercel.ddaiai.com/#/m/gpt-4-gizmo-g-2fkFE8rbu - [X] 支持ChatGPT试的超链模型切换 https://chat.openai.com/g/g-2fkFE8rbu 修改为 https://vercel.ddaiai.com/#/g/g-2fkFE8rbu - [X] chatgpt 支持 GPTs 多模态 - [X] chatgpt 支持 tts whisper - [X] 即时语音识别(浏览器自带语音识别 ASR) `v2.15.7`以上版本 - [X] 支持超链更换设置,适合`one-api` `new-api`部署聊天 https://vercel.ddaiai.com/#/s/t?OPENAI_API_BASE_URL=https://abc.com&OPENAI_API_KEY=sk-xxxxx&MJ_SERVER=https://abc.com&MJ_API_SECRET=sk-xxx&UPLOADER_URL= - [X] 支持`one-api`、`new-api`部署聊天 https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://www.abc.com%22} `(v.2.14.3)` ## 无服务器-个人桌面安装 > - [x] 请到 https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases 下载最新版本安装(选择合适你操作系统的版本) > - [x] 选择一个合适的中转服务商( 最好都支持 `gpt`, `gpts`, `midjourney`, `claude`, `suno` ) > - [x] 中转服务商推荐 https://www.openai-hk.com 一个`key`和`api接口地址` 同时支持 `gpt` `midjourney` `claude` `suno`,mj-fast最低能到0.12rmb/张 ![多模态](./docs/suno-ds.jpg) ## Vercel 一键部署 [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Dooy/chatgpt-web-midjourney-proxy&env=OPENAI_API_BASE_URL&env=OPENAI_API_KEY&env=MJ_SERVER&env=MJ_API_SECRET&project-name=chatgpt-web-midjourney-proxy&repository-name=chatgpt-web-midjourney-proxy) ## env 环境变量 | 环境变量 | 说明 | 默认值 |docker等部署| vercel 部署| | --- | --- | --- | --- | --- | | OPENAI_API_BASE_URL | OpenAI API 接口地址 | https://api.openai.com | ✅ | ✅| | OPENAI_API_KEY | OpenAI API 密钥 | sk-xxxxx | ✅ | ✅| | OPENAI_API_MODEL | 默认模型 | gpt-3.5-turbo | ✅ | ✅| | MJ_SERVER | mj proxy 接口地址 |[搭建参考](https://github.com/novicezk/midjourney-proxy) | ✅ | ✅| | MJ_API_SECRET | mj proxy | 空 | ✅ | ✅| | SUNO_SERVER | SUNO API 接口地址 | [搭建参考](https://github.com/SunoAI-API/Suno-API) | ✅ | ✅| | SUNO_KEY | SUNO API 的key | 空 | ✅ | ✅| | AUTH_SECRET_KEY | 访问授权密码 | 无 | ✅ | x| | API_UPLOADER | 支持上传 | 关闭 | ✅ | x| | HIDE_SERVER | 前端ui隐藏服务端| | ✅ | x| | CUSTOM_MODELS | 自定义可选模型 | 无 | ✅ | ✅| | TJ_BAIDU_ID | 百度统计ID | 无 | ✅ | ✅| | TJ_GOOGLE_ID | 谷歌统计ID | 无 | ✅ | ✅| | SYS_NOTIFY | 系统通知,支持HTML | 无 | ✅ | ✅| | DISABLE_GPT4 | 禁用GPT-4 | 无 | ✅ | ✅| | GPT_URL | 自定 GPT_URL=/gpts.json | 无 也可自己的外链 | ✅ | ✅| | UPLOAD_IMG_SIZE | gpt4v 上传图片大小 | 1 | ✅ | ✅| | SYS_THEME | 默认主题 `light`或者`dark` | dark | ✅ | ✅| | MJ_IMG_WSRV | 是否开启 `wsrv`图床 | 无(关闭) | ✅ | ✅| | AUTH_SECRET_ERROR_COUNT | 防爆破验证:验证次数触发 NGINX 请设置 `proxy_set_header X-Forwarded-For $remote_addr` | 无 | ✅ | x| | AUTH_SECRET_ERROR_TIME | 防爆破验证:停留时间 单位分钟 | 无 | ✅ | x| | CLOSE_MD_PREVIEW | 是否不关闭输入预览 | 无 | ✅ | ✅| | UPLOAD_TYPE | 指定上传方式 [`R2` R2上传] [`API` 跟随UI前端中转]、[`Container` 本地容器]、[`MyUrl` 自定义链接] | 空 | ✅ | x| | MENU_DISABLE | 菜单禁用 可选:gpts,draws,gallery,music | 空 | ✅ | ✅| | VISION_MODEL | 默认使用的识图 可选:`gpt-4o`,`gpt-4-turb`,`gpt-4-vision-preview`等 | 空 | ✅ | ✅| | SYSTEM_MESSAGE | 自定义默认角色消息 | 空 | ✅ | ✅| | CUSTOM_VISION_MODELS | 自定义可视图模型 用`,` 分开 | 空 | ✅ | ✅| ## docker 部署 > - [x] 需 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 支持 > - [x] 需 [Suno-API](https://github.com/SunoAI-API/Suno-API) 支持 ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://your-mj-server:6013 \ -e MJ_API_SECRET=your-mj-api-secret \ -e SUNO_SERVER=https://your-suno-server:8000 \ -e SUNO_KEY=you-suno-key ydlhero/chatgpt-web-midjourney-proxy ``` 访问 http://ip:6015 **文件上传**: ```bash docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e MJ_API_SECRET=abc123456 ydlhero/chatgpt-web-midjourney-proxy ``` 如果是前端ui设置 OPENAI_API_KEY OPENAI_API_BASE_URL ; 图片上传也会随着走 OPENAI_API_BASE_URL走 ```shell curl -X POST -H "Content-Type: multipart/form-data" -F "file=@/path/to/file" http://OPENAI_API_BASE_URL/v1/upload ``` 返回格式 ```json { "url":"https://xxxxxxx.jpg" } ``` ### midjourney-proxy API docker部署 更多参考到 [midjourney-proxy](https://github.com/novicezk/midjourney-proxy) 开源光光 ```bash docker run -d --name mj6013 -p 6013:8080 \ -e mj.discord.guild-id=discord服务ID \ -e mj.discord.channel-id=discord服务组ID \ -e mj.queue.timeout-minutes=6 \ -e mj.api-secret=abc123456 \ -e mj.discord.user-token=********** \ --restart=always novicezk/midjourney-proxy:2.5.5 ``` ## 更多展示 ### 自定义服务端api key、base_url: ![base_url](./docs/gptbase.jpg) ### GPTS GTP Store ![多模态](./docs/gpts.jpg) ![多模态](./docs/gpts1.jpg) ### suno 音乐制作 ![suno](./docs/suno.jpg) ### 录音 whisper 和 tts ![whisper--tts](./docs/tts-whisper.png) ### 局部重绘: [![局部重绘](./docs/mj2.jpg)](./docs/mj2.jpg) ### 换脸 ![换脸](./docs/mj2a2.jpg) ### 混图 ![混图](./docs/mj2a3.jpg) ### 支持图片上传图片 供gpt-4-vision-preview使用 ![混图](./docs/mj4a1.png) 手机端:
## 文件上传 支持cloudflare r2 存储 - cloudflare r2 存储 10 GB/月 免费 https://www.cloudflare.com/zh-cn/developer-platform/r2/ - 配置文档参考 https://zhuanlan.zhihu.com/p/658058503 - vercel 不支持 r2 存储 ```yml R2_DOMAIN= R2_BUCKET_NAME= R2_ACCOUNT_ID= R2_KEY_ID= R2_KEY_SECRET= ``` ## 文件服务器请求优先顺序 R2> 前端UI设置文件服务> 后端文件服务 >跟随中转 ## 防爆破验证设置 ![防爆破](./docs/check_error.jpg) - [x] vercel 不支持;仅支持Docker化部署 - [x] 如果前面挂载 `nginx` 请配置 `proxy_set_header X-Forwarded-For $remote_addr;` - [x] 参数如下: 错误验证3次,只能在10分钟后再验证 ```yml # Secret key 注意: 只能拿事英文+数字 AUTH_SECRET_KEY=my888god #爆破:验证次数 注意: 数字 ;nginx 请设置 proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT=3 #爆破:验证停留时间 单位分钟 注意: 是数字 AUTH_SECRET_ERROR_TIME=10 ``` - [x] 脚本如下 ```shell docker run --name chatgpt-web-midjourney-proxy -d -p 6015:3002 \ -e OPENAI_API_KEY=sk-xxxxx \ -e OPENAI_API_BASE_URL=https://api.openai.com \ -e MJ_SERVER=https://172.17.0.1:6013 \ -e MJ_API_SECRET=abc123456 \ -e API_UPLOADER=1 -v /data/uploads:/app/uploads \ -e AUTH_SECRET_KEY=你的英文密码 -e AUTH_SECRET_ERROR_COUNT=3 \ -e AUTH_SECRET_ERROR_TIME=10 ydlhero/chatgpt-web-midjourney-proxy ``` - ## License MIT © [Dooy](./license) ## 其他 如果觉得这个项目对您有所帮助,请帮忙点个star 或者捐助我们 [![Star History Chart](https://api.star-history.com/svg?repos=Dooy/chatgpt-web-midjourney-proxy&type=Date)](https://star-history.com/#Dooy/chatgpt-web-midjourney-proxy&Date) ## 捐助 如果我的开源项目对你有帮助,请考虑通过以下任意一种方式赞助:
`付款备注上您的联系方式`
微信捐助
支付宝捐助
================================================ FILE: SPONSOR.md ================================================ # Sponsor My Open Source Works 如果我的开源项目对你有帮助,请考虑通过以下任意一种方式赞助: ## 微信赞助 ![微信](./docs/wxpay.jpg) ## 支付宝赞助 ![支付宝](./docs/alipay.jpg) ================================================ FILE: api/proxy.js ================================================ const { createProxyMiddleware } = require('http-proxy-middleware') module.exports = (req, res) => { let target = '' let headers= {} // 代理目标地址 if (req.url.startsWith('/mjapi')) { //这里使用/api可能会与vercel serverless 的 api 路径冲突,根据接口进行调整 target = process.env.MJ_SERVER??'https://api.openai.com'; headers= { 'Mj-Api-Secret': process.env.MJ_API_SECRET // 添加自定义请求头 } }else if(req.url.startsWith('/openapi')){ target = process.env.OPENAI_API_BASE_URL??'https://api.openai.com'; headers= { 'Authorization': 'Bearer ' +process.env.OPENAI_API_KEY // 添加自定义请求头 } } // 创建代理对象并转发请求 createProxyMiddleware({ target, changeOrigin: true, headers, pathRewrite: { // 通过路径重写,去除请求路径中的 `/api` '^/mjapi/': '/' ,'^/openapi/': '/' } })(req, res) } ================================================ FILE: api/session.js ================================================ module.exports = (req, res) => { console.log('session.js', req.body); try { let data = req.body.data; let obj ={ "status": "Success", "message": "", "data": { "isHideServer": false, "isUpload": false, "auth": process.env.AUTH_SECRET_KEY?true:false , "model": "ChatGPTAPI", "amodel": process.env.OPENAI_API_MODEL?? "gpt-3.5-turbo" ,isApiGallery: process.env.MJ_API_GALLERY ? true : false ,cmodels : process.env.CUSTOM_MODELS??'' ,baiduId : process.env.TJ_BAIDU_ID?? "" ,googleId: process.env.TJ_GOOGLE_ID?? "" , notify : process.env.SYS_NOTIFY?? "" ,disableGpt4 : process.env.DISABLE_GPT4?? "" ,isWsrv: process.env.MJ_IMG_WSRV?? "" ,uploadImgSize: process.env.UPLOAD_IMG_SIZE?? "5" ,gptUrl : process.env.GPT_URL?? "" ,theme : process.env.SYS_THEME?? "dark" ,isCloseMdPreview : process.env.CLOSE_MD_PREVIEW?true:false ,menuDisable: process.env.MENU_DISABLE??"" ,visionModel: process.env.VISION_MODEL??"" ,systemMessage: process.env.SYSTEM_MESSAGE??"" ,customVisionModel: process.env.CUSTOM_VISION_MODELS??"" } } res.writeHead(200).end( JSON.stringify( obj ) ); } catch (e) { console.error('session.js', e, req.body); } } ================================================ FILE: api/verify.js ================================================ module.exports = (req, res) => { let obj = { "status": "Fail", "message": "密钥无效 | Secret key is invalid", "data": null }; const auth_secret_keys = process.env.AUTH_SECRET_KEY? process.env.AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''):[]; if (req.body && req.body.token && auth_secret_keys.include(req.body.token)) obj = { status: 'Success', message: 'Verify successfully', data: null } res.setHeader('Content-type', 'application/json'); res.writeHead(200).end( JSON.stringify(obj) ); } ================================================ FILE: api/webdav-proxy.js ================================================ const https = require('https'); const http = require('http'); const { URL } = require('url'); module.exports = async (req, res) => { // 设置 CORS 头 res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // 处理 OPTIONS 请求 if (req.method === 'OPTIONS') { return res.status(200).end(); } // 只允许 POST 请求 if (req.method !== 'POST') { return res.writeHead(405).end(JSON.stringify({ error: 'Method not allowed' })); } try { const { url, method, username, password, data } = req.body; if (!url || !method || !username || !password) { return res.writeHead(400).end(JSON.stringify({ error: '缺少必要参数' })); } // 创建 Basic Auth const auth = Buffer.from(`${username}:${password}`).toString('base64'); const parsedUrl = new URL(url); const options = { hostname: parsedUrl.hostname, port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80), path: parsedUrl.pathname + parsedUrl.search, method: method, headers: { 'Authorization': `Basic ${auth}`, }, timeout: 30000 }; if (method === 'PUT') { options.headers['Content-Type'] = 'application/json'; if (data) { const bodyData = typeof data === 'string' ? data : JSON.stringify(data); options.headers['Content-Length'] = Buffer.byteLength(bodyData); } } if (method === 'PROPFIND') { options.headers['Depth'] = '0'; } const protocol = parsedUrl.protocol === 'https:' ? https : http; const proxyReq = protocol.request(options, (proxyRes) => { let responseData = ''; proxyRes.on('data', (chunk) => { responseData += chunk; }); proxyRes.on('end', () => { const statusCode = proxyRes.statusCode; const isSuccess = (statusCode >= 200 && statusCode < 300) || statusCode === 207; let errorMsg = null; if (!isSuccess) { errorMsg = `HTTP ${statusCode} - ${url}`; if (responseData) { errorMsg += ` | Response: ${responseData.substring(0, 200)}`; } } res.writeHead(200).end(JSON.stringify({ success: isSuccess, status: statusCode, data: responseData, requestUrl: url, error: errorMsg })); }); }); proxyReq.on('error', (error) => { console.error('WebDAV proxy error:', error.message); res.writeHead(500).end(JSON.stringify({ success: false, error: error.message })); }); proxyReq.on('timeout', () => { proxyReq.destroy(); res.writeHead(500).end(JSON.stringify({ success: false, error: '请求超时' })); }); if (method === 'PUT' && data) { const bodyData = typeof data === 'string' ? data : JSON.stringify(data); proxyReq.write(bodyData); } proxyReq.end(); } catch (error) { console.error('WebDAV proxy error:', error.message); res.writeHead(500).end(JSON.stringify({ success: false, error: error.message })); } }; ================================================ FILE: changlog.md ================================================ # 功能升级日志 # 计划 # 2.25.11 - feat: 添加 WebDAV 聊天记录同步功能 #665 # 2.25.10 - 😄 新增画图:nano-banana-2 gpt-image-1.5 gemini-3.1-flash-image-preivew - 😄 新增对话:`gpt-5.1`、`gemini-3-pro-preview`,`grok-4.1` - 2026第一个版本 # 2.25.9 - 🐞 修复:mj显示双图 - 🐞 修复:gpt-5-all gpts 读取不了pdf的问题 - 🐞 修复:nona-banana 请求返回正确,但是页面不显示,原因是确实一个判断逻辑。下面代码即可解决bug #667 - 🐞 修复:MP4格式自动调用whisper-1模型可以去除吗? #666 # 2.25.8 - 😄 新增视频:veo3.1 veo3.1-pro openai/sora-2 openai/sora-2-pro - 😄 修改:sora-2参数 # 2.25.7 - 😄 新增视频:sora-2-pro - 😄 修改:修改 sora-2参数 # 2.25.6 - 😄 新增视频:sora-2 # 2.25.5 - 😄 新增:suno-v5 # 2.25.4 - 😄 新增:nano-banana支持 比例 - 😄 新增:google veo类视频、fal-ai视频类 - 😄 新增:支持直达视频模型 https://vercel.ddaiai.com/#/video/index?tab=all&model=veo3 # 2.25.3 - 😄 新增:dalle格式的 谷歌 nano-banana # 2.25.2 - 🐞 修复:gpt-image-1 无法同时传多个图片 #634 - 🐞 修复:【bug】绘画 gpt-image-1 采用服务端配置生成图片报错 #646 - 🐞 修复: gpt5报错 #650 - 😄 新增:支持 mj 视频组合 `--video` `--bs 2` 生成视频 # 2.25.1 - 😄 新增:支持 suno 模型 `v4.5+` , 将 mv 修改为`chirp-bluejay` # 2.24.10 - 😄 新增:支持 `reasoning_content` # 2.24.9 - 😄 新增:mj `图生视频` `图片编辑` # 2.24.8 - 😄 新增:`flux-kontext-pro` `flux-kontext-max` 模型 # 2.24.7 - 😄 新增:riffusion 音乐模块 - 😄 改进:mj 按钮如果没有预先设置 则直接显示 # 2.24.6 - 😄 新增:mj v6.1 v7的放大 关于MJ V6.1 和 V7 没有放大按钮 #635 - 😄 新增:kling-v2-master 模型 # 2.24.5 - 😄 新增:pix 运镜 # 2.24.4 - 🐞 修复:oref 空 导致 trim错误 # 2.24.3 - 🐞 改进:mj 默认为 v7 - 🐞 改进:mj 支持 oref 全面参考 # 2.24.2 - 😄 新增: suno `v4.5` model 为 `chirp-auk` # 2.24.1 - 😄 新增:gpt-image-1 dall.e-2 支持 v1/image/edit 支持多图 - 🐞 改进:默认上传改为5M # 2.23.10 - 😄 新增:gpt-image-1 这个是dall-e格式 - 😄 新增:pixverse 的 `v4`版本 # 2.23.9 - 😄 新增:rumwayml 支持 gen4_turbo # 2.23.8 - 🐞 改进:识图默认放开都支持 只有gpt-3.5 已知不支持 - 🐞 改进:服务端模型 支持搜索 # 2.23.7 - 😄 新增:模型 mj 7.0 # 2.23.6 - 🐞 修复:2.23.4依旧出现ds-R1不展示思考过程的问题 #611 - 😄 新增:模型 从服务端的 /v1/models 拉起 # 2.23.5 - 😄 新增:`grok-3`,`grok-3-reasoner`,`grok-3-deepsearch` 模型 - 😄 新增:`gpt-4.5-preview-2025-02-27`,`gpt-4.5-preview` 模型 # 2.23.4 - 🐞 修复:`deepseek-v3` `deepseek-r1` 识图处理,需要中转支持 - 🐞 修复:`deepseek-r1` think 思考过程显示优化 # 2.23.3 - 😄 新增:`deepseek-v3` `deepseek-r1` 模型 # 2.23.2 - 😄 支持:Pixverse 模版特效 - 😄 支持:kling 支持 model 选型 `v1` `v1.5` `v1.6` # 2.23.1 - 🐞 修复:Pixverse 时长支持8s 而非10s - 😄 支持:Pixverse style风格 - 🐞 修复:suno 后端转发目录使用 `/suno` # 2.22.10 - 😄 支持:视频模型 Pixverse - 😄 支持:Pixverse 图片、前后帧、扩展 # 2.22.9 - 😄 新增:realtime 可设置模型 `gpt-4o-mini-realtime-preview-2024-12-17` `gpt-4o-realtime-preview-2024-12-17` `gpt-4o-realtime-preview-2024-10-01` # 2.22.8 - 😄 新增:o1 o1-2024-12-17 # 2.22.7 - 😄 修改:suno upload 二次创作方式 # 2.22.6 - 😄 支持:viggle V3-Beta - 😄 支持:pika 2.0 - 😄 新增:pika 3个效果 # 2.22.5 - 🐞 修改:suno默认版本为V4 # 2.22.4 - 🐞 修复:mj shorten - 🐞 修复:mj 图转文 # 2.22.3 - 😄 新增音乐:suno-v4 - 😄 新增gpt模型:gpt-4o-2024-11-20 # 2.22.2 - 😄 新增:支持ruanway 官方api - 🐞 修复:模型识图表示 # 2.22.1 - 😄 新增:超链定位tab 定位到可灵 https://vercel.ddaiai.com//#/video/index?tab=kling - 😄 新增:手机可使用 音乐 # 2.21.10 - 😄 新增:claude-3-5-sonnet-all 模型 - 😄 新增:pika 3个视频效果 - 😄 新增:支持 udio # 2.21.9 - 😄 新增:mj 默认版本为6.1,填写的有保存下次打开 可以重新载入 - 🐞 修复:默认语言(第一次载入的时候)会根据浏览器语言对应,目前支持 中文简体、英语、中文繁体、法语、俄语、韩语、土耳其语、越南语 如果没在这个列表内则为英语 # 2.21.8 - 😄 新增:flux.1.1-pro 画图模型 - 😄 新增:runway3 支持 参考视频 # 2.21.7 - 😄 新增:claude-3-5-sonnet-20241022 # 2.21.6 - 😄 新增:pika 文生视频 图生视频 - 🐞 修复:luma 支持长宽比例 # 2.21.5 - 🐞 修复:luam、runway视频删除、viggle删除、kling删除、suno删除? #510 # 2.21.4 - 😄 新增:runway图片增加首尾帧选择 # 2.21.3 - 🐞 修复:回复数最多只有4096太少导致有时无法正常输出 #516 - 😄 优化:支持实时语音对话服务中的设置 # 2.21.2 - 😄 新增:支持实时语音对话服务 realtime `gpt-4o-realtime-preview` # 2.21.1 - 😄 优化:dall格式图片本地存储(flex,idemgram 不会图片链接过期而找不到 ) - 😄 优化:kling图片本地存储 # 2.20.10 - 😄 新增:模型 `o1-preview` `o1-mini` # 2.20.9 - 🐞 修复:kling 图片提交 - 😄 新增:可灵 kling 的镜头运用 # 2.20.8 - 😄 新增:可灵 kling 视频 绘图模块 # 2.20.7 - 😄 新增:runway 可以 extend - 🐞 修复:ideogram 清空 # 2.20.6 - 😄 新增: 画图 ideogram 相关模块 # 2.20.5 - 😄 新增: flux 相关模型的dall.e格式 - 🐞 修复:claude-3-5,maxtoken问题 #495 # 2.20.4 - 🐞 修复:更新了背景图版本后。聊天窗口内容上下滚动有时候会失效,要重新刷新页面才能滚动 #490 - 🐞 修复:docker部署能不用在编排的时候填写key # 2.20.3 - 🤖 合并: 新增自定义背景图片 #488 @Yanyutin753 - 💄 合并: 优化文件上传样式 #487 @Yanyutin753 - 💄 合并: AUTH_SECRET_KEY 新增多密钥支持,使用,隔开 #484 @Yanyutin753 - 😄 新增: runway Gen3a Turbo - 😄 新增: UI服务端 同步 `runway` `viggle` 设置 # 2.20.2 - 😄 新增:gemini-1.5-pro-exp-0801 - 😄 新增:chatgpt-4o-latest # 2.20.1 - 😄 新增:gpt-4o-2024-08-06 # 2.19.10 - 😄 新增:视频 runway gen3 支持图片 - 😄 新增:mj 6.1选项 - 😄 新增:runway-gen3-fast 选项 - 🐞 修复:LUMA_SERVER 出现标签选项 # 2.19.9 - 🐞 修复:luma 说明 - 🐞 修复:Midjourney生图后,保留prompt在输入框中 #468 # 2.19.8 - 🐞 修复:runway 过期.重新获取 # 2.19.7 - 😄 新增:视频 runway 模块 - 🐞 修复:gpt-4o-mini 图片问题 - 🐞 修复:luma 说明 # 2.19.6 - 😄 新增:gpt-4o-mini模型 - 🐞 修复:viggle 下载有问题 # 2.19.5 - 🐞 修复:后续会有luma尾帧么 #452 - 😄 新增:viggle pro 跟 relax 能相互切换 # 2.19.4 - 🐞 修复:luma pro 与 relax版本切换 获取任务有问题 # 2.19.3 - 🐞 修复:viggle 个人上传视频无效 # 2.19.2 - 😄 新增:跳舞视频viggle模块 # 2.19.1 - 🐞 修复:Luma下载按钮无法下载? #443 - 🐞 修复:luma pro 与 relax版本切换 获取任务有问题 - 🐞 修复:suno 歌词 fail 提示,luma 状态 failed 提示 # 2.18.10 - 🐞 修复:视频按钮提示词,有个小错别字。 #424 - 🐞 修复:claude-3-5-sonnet-20240620无法上传图片 #425 #427 #430 - 🐞 修复:LUMA不支持竖屏9:16 这个对于短视频 不友好 官方是支持的 #431 - 🐞 修复:其实cluade其他模型也是支持识图 #433 - 😄 新增:LUMA视频 支持 `延展` 每 `延展` `+5s` - 😄 修复:LUMA不支持竖屏9:16 这个对于短视频 不友好 官方是支持的 #431 # 2.18.9 - 🐞 修复:luma download_url bug - 🐞 修复:claude-3-5-sonnet-20240620传图片直接给我调用gpt-4-vision-preview #423 # 2.18.8 - 🐞 修复:无法通过?settings={"key":"{key}","url":"{server}"}设置Suno和Luma #412 - 😄 升级:suno请求带 `/suno` 前缀 - 🐞 修复:请求新增逆向模型 `gpt-4o-all` #400 - 😄 新增: `claude-3-5-sonnet-20240620` 模型 - 🐞 修复:Bug: 手机版Safari下地址栏遮挡界面 #371 # 2.18.7 - 😄 新增:支持luma视频 # 2.18.6 - 😄 升级:suno支持延伸 - 😄 升级:suno支持 以音频生成音频(需要用到延伸) # 2.18.5 - 😄 升级:将suno可版本选择 v3 v3.5 - 🐞 修复:suno 生成失败 error 状态 # 2.18.4 - 😄 升级:将suno 升级为3.5版本 # 2.18.3 - 🐞 重大修复:修复卡死.第二处 # 2.18.2 - 🐞 重大修复:修复卡死 # 2.18.1 - 🐞 修复:GPTS页面不支持一个页面一个模型 #378 - 😄 新增:GPTs页 可以新增gpts # 2.17.10 - 😄 新增:新增自定义可视化模型 #338 参数 `CUSTOM_VISION_MODELS` - 🐞 修复:Bug: 设置SYSTEM_MESSAGE后模型依然对KnowledgeCutOffDate有误解 #370 - 🐞 修复:Bug: 手机版Safari下地址栏遮挡界面 #371 # 2.17.9 - 🐞 修复:自定义模型的tokens配置 #362 #333 - 🐞 修复:手机版界面下 MENU_DISABLE 没有生效 #363 - 🐞 修复:绘图的时候自动新建一个对话 #365 # 2.17.8 - 🐞 修复:MJ在等待队列状态下的处理逻辑 - 😄 优化:读图由原来的 `gpt-4-vision-preview` 改为 自定义 # 2.17.7 - 🐞 修复:目前对于公式显示似乎有严重问题 #345 (再次修复) - 🐞 修复:是否支持已有模型列表的自定义? #297 # 2.17.6 - 🐞 修复:目前对于公式显示似乎有严重问题 #345 - 🐞 修复:MJ漏掉V6的2个按钮 高清2倍.subtle 高清2倍.creative - 😄 新增:关于gpts的模型名称传入问题 (支持`g-*`) #334 - 😄 优化:Markdown优化图片显示 # 2.17.5 - 🐞 修复:`gpt-4o`,`gpt-4o-2024-05-13` 截止日期 # 2.17.4 - 🐞 修复:mj放大按钮 有v5变v6 - 😄 新增:`gpt-4o`,`gpt-4o-2024-05-13` 模型 # 2.17.3 - 🐞 修复:左侧菜单栏不显示 #327 # 2.17.2 - 😄 优化:设置服务端设置 填写key 一键同步mj,suno - 😄 优化:左侧菜单栏可以配置 通过环境变量调整 `MENU_DISABLE="gpts,music,gallery"` #308 - 😄 新增:gemini-pro-1.5 模型 #326 - 😄 优化:`gemini-pro-vision` `gemini-pro-1.5` `gpt-4-turbo`,`gpt-4-turbo-2024-04-09` 模型 可读base64图 #326 # 2.17.1 - 😄 优化:模型选择可搜索 - 😄 优化:suno错误提示 #305 - 🐞 修复:mj-api-secret 为空时出错 #295 - 🐞 修复:fix CLOSE_MD_PREVIEW #316 # 2.16.10 - 😄 新增:suno音乐 单独模块 # 2.16.9 - 😄 修复:桌面端程序版本问题 # 2.16.8 - 😄 新增:桌面端程序 # 2.16.7 - 😄 新增:新模型 `gpt-4-turbo-2024-04-09` # 2.16.6 - 🐞 修复:手机端不支持 `sref` `cref` - 😄 新增:`sref` `cref` 上传至discord做为图床 - 😄 新增:新模型 `suno-v3` # 2.16.5 - 🐞 修复:nPaint image editor sources availability #248 - 🐞 修复:Bugs in supporing customer models #235 # 2.16.4 - 😄 新增:turnstile 安全认证 - 🐞 修复:模型切换导致模型错乱 - 🐞 修复:访问上传文件需认证 # 2.16.3 - 😄 新增:MJ `cref` `sref` `cw` 参数 - 🐞 修复:MJ功能问题反馈 #228 - 🐞 修复:关于余额用量精确度的问题建议 #223 - 🐞 修复:mj 清参数 按钮 - 🐞 修复:更新对话模型 未能更新窗口列表 # 2.16.2 - 😄 新增:MJ `--cref 图片url` 生成角色一致的图像 - 🐞 优化:新开会话模型 每个会话一个自己的模型 #211 #193 # 2.16.1 - 🐞 修复:头像链接加载很慢 #212 - 🐞 修复:关于模型`claude-3` `max_tokens` 增加为 4k #214 # 2.15.10 - 🐞 修复:Midjourney Proxy v2.5.5 API后端不接受 index为0的重绘提交 #209 #210 感谢 @hugoshao PR - 🐞 修复:Drawing 多语言本地化问题 #201 感谢 @hugoshao PR - 😄 新增:`claude-3-sonnet-20240229` `claude-3-opus-20240229` 而 `claude-3-opus-20240229` 可支持传图 #207 # 2.15.9 - 🐞 修复:聊天记录能导出,但是导入没成功 #197 - 😄 PR:编辑对话内容 感谢 PR人 @bigQY # 2.15.8 - 🐞 修复:dark模型下的code显示有问题 - 😄 新增:环境变量 `UPLOAD_TYPE` 指定上传方式 ['R2' R2上传] ['API' 跟随UI前端中转]、['Container' 本地容器]、['MyUrl' 自定义链接] #178 - 😄 调整:MJ默认调整为 `v6` # 2.15.7 - 🐞 修复:mj提交错误提示 规范化 - 😄 新增:实时语音识别 # 2.15.6 - 🐞 修复:微信绘图弹窗兼容问题 #177 - 😄 新增:环境变量控制 `CLOSE_MD_PREVIEW=1`,是否开启输入MD预览 #124 - 😄 新增:防爆破验证 相关变量 `AUTH_SECRET_ERROR_COUNT=3` `AUTH_SECRET_ERROR_TIME=10` # 2.15.5 - 🐞 修复:授权提示 `请重新输入授权访问密码` - 😄 新增:提交版本信息 - 😄 新增:@触发使用过的GPTs #140 # 2.15.4 - 🐞 修复:mj 上传文件 服务端授权认证( vercel 暂不支持) #157 # 2.15.3 - 🐞 修复:服务端授权认证( vercel 暂不支持) #138 # 2.15.2 - 😄 新增: 输入预览 增加md功能 #124 - 🐞 修复: 更新模型logo未变化 #137 - 😄 新增: 模型 `gpt-3.5-turbo-0125` - 😄 新增: MJ 模型 `niji V6` # 2.15.1 - 🐞 修复: tts转化在微信内播放有问题 #126 @yoke1990 - 🐞 修复: 自定义GPTs 在vercel 不可使用 #115 - 🐞 修复: 针对每一个对话分别设置模型无效 #128 感谢 - 🔨 优化: MJ 绘画选项组合优化,减少提示词给mj提示错误 #127 感谢 @yoke1990 - 🔨 优化: 清空同时清空标题 #117 - 😄 新增: 环境变量主题 `SYS_THEME` 主题 `light`或者`dark` 默认 `dark` ( 新版本需要 清缓存 ) #123 # 2.14.10 - 😄 新增: TTS 人物设置 - 😄 新增: 环境变量 `UPLOAD_IMG_SIZE` #27 - 🔨 优化: GPTs 踩、赞 - 🔨 优化: 自定义GPTs # 2.14.9 - 😄 新增: 模型 `gpt-4-0125-preview` # 2.14.8 - 🐞 修复:垫图图片不能2次使用 - 😄 新增:标头 列表页 # 2.14.7 - 😄 新增: 补回`temperature` 和 `top_p` `presence_penalty` `frequency_penalty`设置 #86 - 😄 优化: 切换模型中 所有设置能随着对话框保存 - 🐞 修复: 默认画图打开 #99 # 2.14.6 - 😄 新增: 语言版本`法语` `土耳其语` 感谢 @M4K4R PR - 🐞 修复: 手机端token被遮挡 #98 - 🐞 修复: 环境变量 打开wsrv图片图床 `MJ_IMG_WSRV=1` - 🐞 修复: midjourney图片 wsrv图床 bug # 2.14.5 - 😄 新增: midjourney wsrv访问图片 # 2.14.4 - 🐞 修复:手机端的页面绘画不出图 #59 - 🐞 修复:midjourney 强制刷新不起作用 # 2.14.3 - 😄 新增: 角色自定到会话 #75 #40 - 😄 新增: 支持one-api部署聊天 https://vercel.ddaiai.com/#/?settings={%22key%22:%22sk-abc%22,%22url%22:%22https://api.openai.com%22} # 2.14.2 - 🐞 修复: gpt-4-1106-preview 模型 128000 #66 - 😄 新增: 录音whisper转文本对话ChatGPT - 😄 新增: 对话内容tts转语音 - 😄 新增: 文件上传支持 `cloudflare r2 存储` 感谢 @xuzhenjun130 PR # 2.14.1 - 🐞 修复: gpt-4-1106-preview 模型 128k #66 - 🐞 修复: 余额显示方式 #61 - 😄 新增: `DISABLE_GPT4=1` 控制不让用 GPT-4 #65 - 😄 新增: `OpenAi Api Key 错误` 对话框中出现引导设置 # 2.13.10 - 🔨 优化: 输入实时计算剩余tokens #63 - 🐞 修复: 重新获取bug # 2.13.9 - 😄 新增: 超链设置 # 2.13.8 - 🐞 修复: #55 将画图提示词加到2000字 - 🔨 优化: 上传.加入进度条 - 😄 新增: midjourney `清设置`按钮 - 😄 新增: midjourney `自定义变焦`功能 # 2.13.7 - 🐞 修复: #55 名称错误 - 😄 新增: midjourney shorten 操作 - 🐞 修复: 手机端无GPTs入口 # 2.13.6 - 🔨 优化: UI服务端保存 - 😄 新增: 国际化语言包 ## 2.13.5 - 🐞 修复: 历史记录未带附件链接 - 😄 新增: 系统通知 #47 ## 2.13.4 - 🐞 修复: midjourney 参数不起作用 ## 2.13.3 - 😄 更新: 更新本月使用量、余额的请求方式 ## 2.13.2 - 🐞 修复: midjourney 刷新错误 - ✅ 新增: tts whisper 界面支持 - 😄 新增: midjourney 新增 V6 ## 2.13.1 - 🐞 修复: gpts 加载排序 - 😄 新增: google、百度统计 - 😄 新增: 文件支持拖拽上传、粘贴截图上传 #39 ## 2.12.11 - 🐞 紧急修复: gpt-4-vision-preview 格式错误 ## 2.12.10 - 🐞 修复:希望实现左侧绘画功能区固定,不随对话界面上下滚动 #29 - 🐞 修复:当服务端有错误,ui错误显示为空bug - 🔨 优化:新增 `CUSTOM_MODELS` 环境变量 可自定义可选模型 #32 ## 2.12.9 - 🐞 修复:按住回车不放,会一直触发提交刷新页面 #24 - 🔨 优化:我的画廊 支持来之服务端的数据(适合自建服务器) - 🔨 优化:midjourney 新增 `原始链接` 按钮 ## 2.12.8 - 😄 新增:我的画廊 - 🐞 修复:重试按钮、停止按钮功能 #15 ## 2.12.7 - 😄 新增:vercel 增加 AUTH_SECRET_KEY 可以访问输入验证 #15 - 🐞 修复:OPENAI_API_MODEL 默认模型 同时支持 vercel #16 - 🐞 修复:在手机端左侧没法下滑 #18 ## 2.12.6 - 🐞 修复:`经常出现“新建聊天框”遮挡对话框的情况 ` #13 - 🐞 修复:当GPTS在绘画窗口,切换不起效果 - 🐞 修复:分页载入GPTs计数出现的问题 ## 2.12.5 - 🔨 优化:丰富 GPTS 内容,可以搜索 - 😄 新增:前端UI 设置 上传文件入口 #11 - 🐞 修复:`经常出现“新建聊天框”遮挡对话框的情况 ` #13 ## 2.12.4 - 😄 新增 dall-e-2模型 - 🐞 修复:上传错误提示为空 - 🐞 修复:`环境变量中配置的OPENAI_API_BASE_URL和OPENAI_API_KEY依旧没有效果,前端对话一直处于“思考中...”` #4 ## 2.12.3 - 😄 新增 支持超链模型切换 http://ip:6013/#/m/gpt-4-all http://ip:6013/#/m/gpt-4-gizmo-1234 - 😄 新增 支持 GPTs 多模态 ## 2.12.2 - 😄 新增:支持文件后端上传(供给gpt-4-all gpt-4-gizmo-xxx 模型)! 默认是关闭的 打开需要环境变量 API_UPLOADER=1 - 😄 新增:支持逆向模型 gpt-4-all gpt-4-v gpt-4-gizmo-(gizmo_id) ## 2.12.1 - 😄 新增:图片上传图片 供gpt-4-vision-preview使用 - 🐞 修复::midjourney 辅助提示“模型版本” 去掉早期过时版本 ## 2.11.10 - 🐞 修复:dall-e-3的大小规格 - 😄 新增:gpt模型选择 - 😄 新增:gpt自定义模型、上下文数、回复数 - 🔩 更改:流请求方式由原来的axios改为fetch 打字效果更加顺滑 ## 2.11.9 - 😄 新增:dall-e-3 画图 ## 2.11.8 - 🐞 修复:midjourney 辅助提示“性格” 出现的bug - 😄 新增:最新版本检查 - 😄 新增:midjourney 获取seed ## 2.11.7 - 😀 新增:midjourney 换脸 - 😀 新增:midjourney 混图 ================================================ FILE: docker-compose/docker-compose.yml ================================================ version: '3' services: gptweb: container_name: chatgpt-web-midjourney-proxy image: ydlhero/chatgpt-web-midjourney-proxy # 总是使用latest,更新时重新pull该tag镜像即可 ports: - 6050:3002 environment: TZ: Asia/Shanghai # 指定时区 # 必选 OPENAI_API_KEY: sk-xxxx # API接口地址,可选,设置 OPENAI_API_KEY 时可用 OPENAI_API_BASE_URL: # API模型,可选,设置 OPENAI_API_KEY 时可用 OPENAI_API_MODEL: # 访问权限密钥,可选 AUTH_SECRET_KEY: # midjourney 服务器地址,可选 可用下面的 http://midjourney-proxy:8080 MJ_SERVER: # midjourney API密钥,可选 MJ_API_SECRET: #API_UPLOADER 是否可以上传 1 可以其他都不可以,可选 API_UPLOADER: #HIDE_SERVER 隐藏服务端 1,可选 HIDE_SERVER: #自定义模型 CUSTOM_MODELS=-gpt-3.5-turbo-0301,gpt-4.5 不显示 gpt-3.5-turbo-0301 新增加 gpt-4.5,可选 CUSTOM_MODELS: #TJ_BAIDU_ID 百度统计ID,可选 TJ_BAIDU_ID: #TJ_GOOGLE_ID 谷歌统计ID,可选 TJ_GOOGLE_ID: #SYS_NOTIFY 系统通知 支持HTML ,可选 SYS_NOTIFY: #FILE_SERVER 文件服务器,可选 可以用下面的 http://fileserver:3012 FILE_SERVER: #DISABLE_GPT4=1 前端限制GPT4调用,可选 DISABLE_GPT4: # cloudflare r2 存储 10 GB/月 免费 https://www.cloudflare.com/zh-cn/developer-platform/r2/ R2_DOMAIN: R2_BUCKET_NAME: R2_ACCOUNT_ID: R2_KEY_ID: R2_KEY_SECRET: ## UPLOAD_IMG_SIZE gpt-4-version 图片上传大小 单位是兆 注意别带单位 最好别超过10 UPLOAD_IMG_SIZE: 1 # GPT_URL=/gpts.json 自定义GPTs模型 GPT_URL: # SYS_THEME 主题 theme light 或者 dark SYS_THEME: dark #关闭MD预览 CLOSE_MD_PREVIEW=1 CLOSE_MD_PREVIEW: #爆破:验证次数 注意: vercel 不支持 nginx 请设置 proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT: 3 #爆破:验证停留时间 单位分钟 注意: vercel 不支持 AUTH_SECRET_ERROR_TIME: 10 ================================================ FILE: docker-compose/gpt-mj/deploy.sh ================================================ #!/bin/bash set -e docker compose pull docker compose up -d --remove-orphans ================================================ FILE: docker-compose/gpt-mj/docker-compose.yml ================================================ version: '3' services: gptweb: image: ydlhero/chatgpt-web-midjourney-proxy ports: - 6055:3002 environment: TZ: Asia/Shanghai # 指定时区 # 必选 OPENAI_API_KEY: sk-xxxx # API接口地址,可选,设置 OPENAI_API_KEY 时可用 OPENAI_API_BASE_URL: # midjourney 服务器地址,可选 MJ_SERVER: http://midjourney-proxy:8080 # midjourney API密钥,可选 MJ_API_SECRET: mjpassword # midjourney服务 可选 midjourney-proxy: image: novicezk/midjourney-proxy:2.5.5 restart: always # ports: # - 6013:8080 #映射端口 environment: TZ: Asia/Shanghai # 指定时区 mj.discord.guild-id: xxxx mj.discord.channel-id: xxx mj.discord.user-token: tooken-xxx mj.api-secret: mjpassword ================================================ FILE: docker-compose/gpt-mj/readme.md ================================================ ### 仅部署chatgpt和mj ```shell git clone https://github.com/Dooy/chatgpt-web-midjourney-proxy.git cd chatgpt-web-midjourney-proxy/docker-compose/gpt-mj #修改 docker-compose.yml 文件配置文件 ./deploy.sh ``` ================================================ FILE: docker-compose/gpts-mj-file/docker-compose.yml ================================================ version: '3' services: gptweb: container_name: chatgpt-web-midjourney-proxy image: ydlhero/chatgpt-web-midjourney-proxy # 总是使用latest,更新时重新pull该tag镜像即可 ports: - 6050:3002 environment: TZ: Asia/Shanghai # 指定时区 # 必选 OPENAI_API_KEY: sk-xxxx # API接口地址,可选,设置 OPENAI_API_KEY 时可用 OPENAI_API_BASE_URL: # 访问权限密钥,可选 注意修改 AUTH_SECRET_KEY: mygod # midjourney 服务器地址,可选 可用下面的 http://midjourney-proxy:8080 MJ_SERVER: http://midjourney-proxy:8080 # midjourney API密钥,可选 MJ_API_SECRET: mygod #API_UPLOADER 是否可以上传 1 可以其他都不可以,可选 API_UPLOADER: 1 #FILE_SERVER 文件服务器,可选 可以用下面的 http://fileserver:3012 FILE_SERVER: http://fileserver:3012 #爆破:验证次数 注意: vercel 不支持 nginx 请设置 proxy_set_header X-Forwarded-For $remote_addr; AUTH_SECRET_ERROR_COUNT: 3 #爆破:验证停留时间 单位分钟 注意: vercel 不支持 AUTH_SECRET_ERROR_TIME: 10 # midjourney服务 可选 midjourney-proxy: image: novicezk/midjourney-proxy:2.5.5 restart: always # ports: # - 6013:8080 #映射端口 environment: TZ: Asia/Shanghai # 指定时区 mj.discord.guild-id: xxx # xxx 如何获取 mj.discord.channel-id: xxx mj.discord.user-token: xxx mj.api-secret: mygod # MJ_API_SECRET #文件服务 可选 fileserver: image: ydlhero/file-server:latest restart: always environment: TZ: Asia/Shanghai # 指定时区 #对外显示的域名 SERVER_NAME: http://myip:3102 ports: - "3102:3102" volumes: - /data/uploads:/app/uploads ================================================ FILE: docker-compose/gpts-mj-file/nginx/nginx.conf ================================================ server { listen 80; server_name localhost; charset utf-8; error_page 500 502 503 504 /50x.html; # 防止爬虫抓取 if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") { return 403; } location / { root /usr/share/nginx/html; try_files $uri /index.html; } location /api { proxy_set_header X-Real-IP $remote_addr; #转发用户IP proxy_pass http://app:3002; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ================================================ FILE: docker-compose/gpts-mj-file/readme.md ================================================ ### docker-compose 部署教程 ```shell git clone https://github.com/Dooy/chatgpt-web-midjourney-proxy.git cd chatgpt-web-midjourney-proxy/docker-compose/gpts-mj-file #修改 docker-compose.yml 文件配置问文件 #如果执行有问题 请执行 start_h.sh start.sh ``` ================================================ FILE: docker-compose/gpts-mj-file/start.sh ================================================ #!/bin/bash set -e # docker compose pull # docker compose up -d --remove-orphans docker-compose pull docker-compose up -d --remove-orphans ================================================ FILE: docker-compose/gpts-mj-file/start_h.sh ================================================ #!/bin/bash set -e docker compose pull docker compose up -d --remove-orphans ================================================ FILE: docker-compose/readme.md ================================================ ### docker-compose 部署教程 - 将打包好的前端文件放到 `nginx/html` 目录下 - ```shell # 启动 docker-compose up -d ``` - ```shell # 查看运行状态 docker ps ``` - ```shell # 结束运行 docker-compose down ``` ================================================ FILE: index.html ================================================ ChatGPT Web Midjourney Proxy
================================================ FILE: kubernetes/README.md ================================================ ## 增加一个Kubernetes的部署方式 ``` kubectl apply -f deploy.yaml ``` ### 如果需要Ingress域名接入 ``` kubectl apply -f ingress.yaml ``` ================================================ FILE: kubernetes/deploy.yaml ================================================ apiVersion: apps/v1 kind: Deployment metadata: name: chatgpt-web labels: app: chatgpt-web spec: replicas: 1 selector: matchLabels: app: chatgpt-web strategy: type: RollingUpdate template: metadata: labels: app: chatgpt-web spec: containers: - image: chenzhaoyu94/chatgpt-web name: chatgpt-web imagePullPolicy: Always ports: - containerPort: 3002 env: - name: OPENAI_API_KEY value: sk-xxx - name: OPENAI_API_BASE_URL value: 'https://api.openai.com' - name: OPENAI_API_MODEL value: gpt-3.5-turbo - name: API_REVERSE_PROXY value: https://ai.fakeopen.com/api/conversation - name: AUTH_SECRET_KEY value: '123456' - name: TIMEOUT_MS value: '60000' - name: SOCKS_PROXY_HOST value: '' - name: SOCKS_PROXY_PORT value: '' - name: HTTPS_PROXY value: '' resources: limits: cpu: 500m memory: 500Mi requests: cpu: 300m memory: 300Mi --- apiVersion: v1 kind: Service metadata: labels: app: chatgpt-web name: chatgpt-web spec: ports: - name: chatgpt-web port: 3002 protocol: TCP targetPort: 3002 selector: app: chatgpt-web type: ClusterIP ================================================ FILE: kubernetes/ingress.yaml ================================================ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-connect-timeout: '5' name: chatgpt-web spec: rules: - host: chatgpt.example.com http: paths: - backend: service: name: chatgpt-web port: number: 3002 path: / pathType: ImplementationSpecific tls: - secretName: chatgpt-web-tls ================================================ FILE: license ================================================ MIT License Copyright (c) 2023 Dooy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: package.json ================================================ { "name": "chatgpt-web-midjourney-proxy", "version": "2.26.1", "private": false, "description": "ChatGPT Web Midjourney Proxy", "author": "Dooy ", "keywords": [ "chatgpt-web", "chatgpt", "chatbot", "Midjourney", "Midjourney UI", "Midjourney Proxy", "gpts", "gpts ui", "vue" ], "scripts": { "dev": "vite", "build": "run-p build-only", "buildold": "run-p type-check build-only", "preview": "vite preview", "build-only": "vite build", "type-check": "vue-tsc --noEmit", "lint": "eslint .", "lint:fix": "eslint . --fix", "bootstrap": "pnpm install && pnpm run common:prepare", "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml", "common:prepare": "husky install" }, "dependencies": { "@ffmpeg/ffmpeg": "^0.12.10", "@ffmpeg/util": "^0.12.1", "@traptitech/markdown-it-katex": "^3.6.0", "@vueuse/core": "^9.13.0", "eventsource-parser": "^1.1.1", "form-data": "^4.0.0", "gpt-tokenizer": "^2.1.2", "highlight.js": "^11.7.0", "html2canvas": "^1.4.1", "js-audio-recorder": "^1.0.7", "katex": "^0.16.4", "localforage": "^1.10.0", "markdown-it": "^13.0.1", "naive-ui": "^2.34.3", "pinia": "^2.0.33", "vue": "^3.2.47", "vue-i18n": "^9.2.2", "vue-router": "^4.1.6", "vue-turnstile": "^1.0.8", "vue-waterfall-plugin-next": "^2.3.1" }, "devDependencies": { "@antfu/eslint-config": "^0.35.3", "@commitlint/cli": "^17.4.4", "@commitlint/config-conventional": "^17.4.4", "@iconify/vue": "^4.1.0", "@openai/realtime-api-beta": "github:dooy/openai-realtime-api-beta", "@openai/realtime-wavtools": "github:dooy/openai-realtime-wavtools", "@tauri-apps/cli": "^1.5.11", "@types/crypto-js": "^4.1.1", "@types/katex": "^0.16.0", "@types/markdown-it": "^12.2.3", "@types/markdown-it-link-attributes": "^3.0.1", "@types/node": "^18.14.6", "@vitejs/plugin-vue": "^4.0.0", "autoprefixer": "^10.4.13", "axios": "^1.3.4", "crypto-js": "^4.1.1", "eslint": "^8.35.0", "http-proxy-middleware": "^2.0.6", "husky": "^8.0.3", "less": "^4.1.3", "lint-staged": "^13.1.2", "markdown-it-link-attributes": "^4.0.1", "npm-run-all": "^4.1.5", "postcss": "^8.4.21", "rimraf": "^4.2.0", "tailwindcss": "^3.3.6", "typescript": "~4.9.5", "vite": "^4.2.0", "vite-plugin-pwa": "^0.14.4", "vite-plugin-static-copy": "^0.17.0", "vue-tsc": "^1.2.0" }, "lint-staged": { "*.{ts,tsx,vue}": [ "pnpm lint:fix" ] } } ================================================ FILE: postcss.config.js ================================================ module.exports = { plugins: { tailwindcss: {}, autoprefixer: {}, }, } ================================================ FILE: public/gpts.json ================================================ { "tag": [ "图像", "论文", "文件", "识别", "PDF", "新闻", "医生", "老师", "Logo" ], "gpts": [ { "gid": "gpt-4-all", "name": "gpt-4-all", "logo": "https://cos.aitutu.cc/gpts/gpt4all.jpg", "info": "集合官方GPT-4、联网,多模态(gpt-4v),绘图功能(dall-e3),限制不支持function等", "use_cnt": "8624", "bad": "0" }, { "gid": "gpt-4-gizmo-g-2fkFE8rbu", "name": "DALL·E", "logo": "https://files.oaiusercontent.com/file-SxYQO0Fq1ZkPagkFtg67DRVb?se=2123-10-12T23%3A57%3A32Z&sp=r&sv=2021-08-06&sr=b&rscc=max-age%3D31536000%2C%20immutable&rscd=attachment%3B%20filename%3Dagent_3.webp&sig=pLlQh8oUktqQzhM09SDDxn5aakqFuM2FAPptuA0mbqc%3D", "info": "让我将你的想象变成图像 – 基于 ChatGPT", "use_cnt": "3087", "bad": "1" } ] } ================================================ FILE: service/.eslintrc.json ================================================ { "root": true, "ignorePatterns": ["build"], "extends": ["@antfu"] } ================================================ FILE: service/.gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules .DS_Store dist dist-ssr coverage *.local /cypress/videos/ /cypress/screenshots/ # Editor directories and files .vscode/* !.vscode/settings.json !.vscode/extensions.json .idea *.suo *.ntvs* *.njsproj *.sln *.sw? build ================================================ FILE: service/.npmrc ================================================ enable-pre-post-scripts=true ================================================ FILE: service/.vscode/extensions.json ================================================ { "recommendations": ["dbaeumer.vscode-eslint"] } ================================================ FILE: service/.vscode/settings.json ================================================ { "prettier.enable": false, "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, "eslint.validate": [ "javascript", "typescript", "json", "jsonc", "json5", "yaml" ], "cSpell.words": [ "antfu", "chatgpt", "esno", "GPTAPI", "OPENAI" ] } ================================================ FILE: service/package.json ================================================ { "name": "chatgpt-web-service", "version": "2.15.6", "private": false, "description": "ChatGPT Web Midjourney Proxy", "author": "ChenZhaoYu ", "keywords": [ "chatgpt-web", "chatgpt", "chatbot", "express" ], "engines": { "node": "^16 || ^18 || ^19" }, "scripts": { "start": "esno ./src/index.ts", "dev": "esno watch ./src/index.ts", "prod": "node ./build/index.mjs", "build": "pnpm clean && tsup", "clean": "rimraf build", "lint": "eslint .", "lint:fix": "eslint . --fix", "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml" }, "dependencies": { "aws-sdk": "^2.1535.0", "axios": "^1.3.4", "body-parser": "^1.20.2", "chatgpt": "^5.1.2", "dotenv": "^16.0.3", "esno": "^0.16.3", "express": "^4.18.2", "express-http-proxy": "^2.0.0", "express-rate-limit": "^6.7.0", "form-data": "^4.0.0", "http-proxy-middleware": "^2.0.6", "https-proxy-agent": "^5.0.1", "isomorphic-fetch": "^3.0.0", "md5": "^2.3.0", "multer": "1.4.5-lts.1", "node-fetch": "^3.3.0", "socks-proxy-agent": "^7.0.0", "uuid": "^9.0.1" }, "devDependencies": { "@antfu/eslint-config": "^0.35.3", "@types/express": "^4.17.17", "@types/node": "^18.14.6", "eslint": "^8.35.0", "rimraf": "^4.3.0", "tsup": "^6.6.3", "typescript": "^4.9.5" } } ================================================ FILE: service/src/chatgpt/index.ts ================================================ import * as dotenv from 'dotenv' import 'isomorphic-fetch' import type { ChatGPTAPIOptions, ChatMessage, SendMessageOptions } from 'chatgpt' import { ChatGPTAPI, ChatGPTUnofficialProxyAPI } from 'chatgpt' import { SocksProxyAgent } from 'socks-proxy-agent' import httpsProxyAgent from 'https-proxy-agent' import fetch from 'node-fetch' import { sendResponse } from '../utils' import { isNotEmptyString } from '../utils/is' import type { ApiModel, ChatContext, ChatGPTUnofficialProxyAPIOptions, ModelConfig } from '../types' import type { RequestOptions, SetProxyOptions, UsageResponse } from './types' const { HttpsProxyAgent } = httpsProxyAgent dotenv.config() const ErrorCodeMessage: Record = { 401: '[OpenAI] 提供错误的API密钥 | Incorrect API key provided', 403: '[OpenAI] 服务器拒绝访问,请稍后再试 | Server refused to access, please try again later', 502: '[OpenAI] 错误的网关 | Bad Gateway', 503: '[OpenAI] 服务器繁忙,请稍后再试 | Server is busy, please try again later', 504: '[OpenAI] 网关超时 | Gateway Time-out', 500: '[OpenAI] 服务器繁忙,请稍后再试 | Internal Server Error', } const timeoutMs: number = !isNaN(+process.env.TIMEOUT_MS) ? +process.env.TIMEOUT_MS : 100 * 1000 const disableDebug: boolean = process.env.OPENAI_API_DISABLE_DEBUG === 'true' let apiModel: ApiModel const model = isNotEmptyString(process.env.OPENAI_API_MODEL) ? process.env.OPENAI_API_MODEL : 'gpt-3.5-turbo' if (!isNotEmptyString(process.env.OPENAI_API_KEY) && !isNotEmptyString(process.env.OPENAI_ACCESS_TOKEN)){ process.env.OPENAI_API_BASE_URL="https://api.openai.com" process.env.OPENAI_API_KEY="sk-xxx" } //throw new Error('Missing OPENAI_API_KEY or OPENAI_ACCESS_TOKEN environment variable') let api: ChatGPTAPI | ChatGPTUnofficialProxyAPI (async () => { // More Info: https://github.com/transitive-bullshit/chatgpt-api if (isNotEmptyString(process.env.OPENAI_API_KEY)) { const OPENAI_API_BASE_URL = process.env.OPENAI_API_BASE_URL const options: ChatGPTAPIOptions = { apiKey: process.env.OPENAI_API_KEY, completionParams: { model }, debug: !disableDebug, } // increase max token limit if use gpt-4 if (model.toLowerCase().includes('gpt-4')) { // if use 32k model if (model.toLowerCase().includes('32k')) { options.maxModelTokens = 32768 options.maxResponseTokens = 8192 } else { options.maxModelTokens = 8192 options.maxResponseTokens = 2048 } } else if (model.toLowerCase().includes('gpt-3.5')) { if (model.toLowerCase().includes('16k')) { options.maxModelTokens = 16384 options.maxResponseTokens = 4096 } } if (isNotEmptyString(OPENAI_API_BASE_URL)) options.apiBaseUrl = `${OPENAI_API_BASE_URL}/v1` setupProxy(options) api = new ChatGPTAPI({ ...options }) apiModel = 'ChatGPTAPI' } else { const options: ChatGPTUnofficialProxyAPIOptions = { accessToken: process.env.OPENAI_ACCESS_TOKEN, apiReverseProxyUrl: isNotEmptyString(process.env.API_REVERSE_PROXY) ? process.env.API_REVERSE_PROXY : 'https://ai.fakeopen.com/api/conversation', model, debug: !disableDebug, } setupProxy(options) api = new ChatGPTUnofficialProxyAPI({ ...options }) apiModel = 'ChatGPTUnofficialProxyAPI' } })() async function chatReplyProcess(options: RequestOptions) { const { message, lastContext, process, systemMessage, temperature, top_p } = options try { let options: SendMessageOptions = { timeoutMs } if (apiModel === 'ChatGPTAPI') { if (isNotEmptyString(systemMessage)) options.systemMessage = systemMessage options.completionParams = { model, temperature, top_p } } if (lastContext != null) { if (apiModel === 'ChatGPTAPI') options.parentMessageId = lastContext.parentMessageId else options = { ...lastContext } } const response = await api.sendMessage(message, { ...options, onProgress: (partialResponse) => { process?.(partialResponse) }, }) return sendResponse({ type: 'Success', data: response }) } catch (error: any) { const code = error.statusCode global.console.log(error) if (Reflect.has(ErrorCodeMessage, code)) return sendResponse({ type: 'Fail', message: ErrorCodeMessage[code] }) return sendResponse({ type: 'Fail', message: error.message ?? 'Please check the back-end console' }) } } async function fetchUsage() { const OPENAI_API_KEY = process.env.OPENAI_API_KEY const OPENAI_API_BASE_URL = process.env.OPENAI_API_BASE_URL if (!isNotEmptyString(OPENAI_API_KEY)) return Promise.resolve('-') const API_BASE_URL = isNotEmptyString(OPENAI_API_BASE_URL) ? OPENAI_API_BASE_URL : 'https://api.openai.com' const [startDate, endDate] = formatDate() // 每月使用量 const urlUsage = `${API_BASE_URL}/v1/dashboard/billing/usage?start_date=${startDate}&end_date=${endDate}` const headers = { 'Authorization': `Bearer ${OPENAI_API_KEY}`, 'Content-Type': 'application/json', } const options = {} as SetProxyOptions setupProxy(options) try { // 获取已使用量 const useResponse = await options.fetch(urlUsage, { headers }) if (!useResponse.ok) throw new Error('获取使用量失败') const usageData = await useResponse.json() as UsageResponse const usage = Math.round(usageData.total_usage) / 100 return Promise.resolve(usage ? `$${usage}` : '-') } catch (error) { global.console.log(error) return Promise.resolve('-') } } function formatDate(): string[] { const today = new Date() const year = today.getFullYear() const month = today.getMonth() + 1 const lastDay = new Date(year, month, 0) const formattedFirstDay = `${year}-${month.toString().padStart(2, '0')}-01` const formattedLastDay = `${year}-${month.toString().padStart(2, '0')}-${lastDay.getDate().toString().padStart(2, '0')}` return [formattedFirstDay, formattedLastDay] } async function chatConfig() { const usage = await fetchUsage() const reverseProxy = process.env.API_REVERSE_PROXY ?? '-' const httpsProxy = (process.env.HTTPS_PROXY || process.env.ALL_PROXY) ?? '-' const socksProxy = (process.env.SOCKS_PROXY_HOST && process.env.SOCKS_PROXY_PORT) ? (`${process.env.SOCKS_PROXY_HOST}:${process.env.SOCKS_PROXY_PORT}`) : '-' return sendResponse({ type: 'Success', data: { apiModel, reverseProxy, timeoutMs, socksProxy, httpsProxy, usage }, }) } function setupProxy(options: SetProxyOptions) { if (isNotEmptyString(process.env.SOCKS_PROXY_HOST) && isNotEmptyString(process.env.SOCKS_PROXY_PORT)) { const agent = new SocksProxyAgent({ hostname: process.env.SOCKS_PROXY_HOST, port: process.env.SOCKS_PROXY_PORT, userId: isNotEmptyString(process.env.SOCKS_PROXY_USERNAME) ? process.env.SOCKS_PROXY_USERNAME : undefined, password: isNotEmptyString(process.env.SOCKS_PROXY_PASSWORD) ? process.env.SOCKS_PROXY_PASSWORD : undefined, }) options.fetch = (url, options) => { return fetch(url, { agent, ...options }) } } else if (isNotEmptyString(process.env.HTTPS_PROXY) || isNotEmptyString(process.env.ALL_PROXY)) { const httpsProxy = process.env.HTTPS_PROXY || process.env.ALL_PROXY if (httpsProxy) { const agent = new HttpsProxyAgent(httpsProxy) options.fetch = (url, options) => { return fetch(url, { agent, ...options }) } } } else { options.fetch = (url, options) => { return fetch(url, { ...options }) } } } function currentModel(): ApiModel { return apiModel } export type { ChatContext, ChatMessage } export { chatReplyProcess, chatConfig, currentModel } ================================================ FILE: service/src/chatgpt/types.ts ================================================ import type { ChatMessage } from 'chatgpt' import type fetch from 'node-fetch' export interface RequestOptions { message: string lastContext?: { conversationId?: string; parentMessageId?: string } process?: (chat: ChatMessage) => void systemMessage?: string temperature?: number top_p?: number } export interface SetProxyOptions { fetch?: typeof fetch } export interface UsageResponse { total_usage: number } ================================================ FILE: service/src/index.ts ================================================ import express from 'express' import type { RequestProps } from './types' import type { ChatMessage } from './chatgpt' import { chatConfig, chatReplyProcess, currentModel } from './chatgpt' import { auth, authV2, mlog, regCookie, turnstileCheck, verify } from './middleware/auth' import { limiter } from './middleware/limiter' import { isNotEmptyString,formattedDate } from './utils/is' import multer from "multer" import path from "path" import fs from "fs" import pkg from '../package.json' // const { createProxyMiddleware } = require('http-proxy-middleware'); //import {createProxyMiddleware} from "http-proxy-middleware" import proxy from "express-http-proxy" import bodyParser from 'body-parser'; import FormData from 'form-data' import axios from 'axios'; import AWS from 'aws-sdk'; import { v4 as uuidv4} from 'uuid'; import { viggleProxyFileDo,viggleProxy, lumaProxy, runwayProxy, ideoProxy, ideoProxyFileDo, klingProxy, pikaProxy, udioProxy, runwaymlProxy, pixverseProxy, sunoProxy, GptImageEdit } from './myfun' const app = express() const router = express.Router() app.use(express.static('public' ,{ // 设置响应头,允许带有查询参数的请求访问静态文件 setHeaders: (res, path, stat) => { res.set('Cache-Control', 'public, max-age=1'); } } )) //app.use(express.json()) app.use(bodyParser.json({ limit: '10mb' })); //大文件传输 app.all('*', (_, res, next) => { res.header('Access-Control-Allow-Origin', '*') res.header('Access-Control-Allow-Headers', 'authorization, Content-Type') res.header('Access-Control-Allow-Methods', '*') next() }) router.post('/chat-process',authV2 , async (req, res) => { //[authV2, limiter] res.setHeader('Content-type', 'application/octet-stream') try { const { prompt, options = {}, systemMessage, temperature, top_p } = req.body as RequestProps let firstChunk = true await chatReplyProcess({ message: prompt, lastContext: options, process: (chat: ChatMessage) => { res.write(firstChunk ? JSON.stringify(chat) : `\n${JSON.stringify(chat)}`) firstChunk = false }, systemMessage, temperature, top_p, }) } catch (error) { res.write(JSON.stringify(error)) } finally { res.end() } }) router.post('/config', auth, async (req, res) => { try { const response = await chatConfig() res.send(response) } catch (error) { res.send(error) } }) router.post('/session', async (req, res) => { try { const AUTH_SECRET_KEY = process.env.AUTH_SECRET_KEY const hasAuth = isNotEmptyString(AUTH_SECRET_KEY) const isUpload= isNotEmptyString( process.env.API_UPLOADER ) const isHideServer= isNotEmptyString( process.env.HIDE_SERVER ); const amodel= process.env.OPENAI_API_MODEL?? "gpt-3.5-turbo" ; const isApiGallery= isNotEmptyString( process.env.MJ_API_GALLERY ); const cmodels = process.env.CUSTOM_MODELS??'' ; const baiduId=process.env.TJ_BAIDU_ID?? "" ; const googleId=process.env.TJ_GOOGLE_ID?? "" ; const notify = process.env.SYS_NOTIFY?? "" ; const disableGpt4 = process.env.DISABLE_GPT4?? "" ; const isUploadR2 = isNotEmptyString(process.env.R2_DOMAIN); const isWsrv = process.env.MJ_IMG_WSRV?? "" const uploadImgSize = process.env.UPLOAD_IMG_SIZE?? "5" const gptUrl = process.env.GPT_URL?? ""; const theme = process.env.SYS_THEME?? "dark"; const isCloseMdPreview = process.env.CLOSE_MD_PREVIEW?true:false const uploadType= process.env.UPLOAD_TYPE const turnstile= process.env.TURNSTILE_SITE const menuDisable= process.env.MENU_DISABLE??"" const visionModel= process.env.VISION_MODEL??"" const systemMessage= process.env.SYSTEM_MESSAGE??"" const customVisionModel= process.env.CUSTOM_VISION_MODELS??"" const backgroundImage = process.env.BACKGROUND_IMAGE ?? "" let isHk= (process.env.OPENAI_API_BASE_URL??"").toLocaleLowerCase().indexOf('-hk')>0 if(!isHk) isHk= (process.env.LUMA_SERVER??"").toLocaleLowerCase().indexOf('-hk')>0 if(!isHk) isHk= (process.env.VIGGLE_SERVER??"").toLocaleLowerCase().indexOf('-hk')>0 const data= { disableGpt4,isWsrv,uploadImgSize,theme,isCloseMdPreview,uploadType, notify , baiduId, googleId,isHideServer,isUpload, auth: hasAuth , model: currentModel(),amodel,isApiGallery,cmodels,isUploadR2,gptUrl ,turnstile,menuDisable,visionModel,systemMessage,customVisionModel,backgroundImage,isHk } res.send({ status: 'Success', message: '', data}) } catch (error) { res.send({ status: 'Fail', message: error.message, data: null }) } }) router.post('/verify', verify) router.get('/reg', regCookie ) const API_BASE_URL = isNotEmptyString(process.env.OPENAI_API_BASE_URL) ? process.env.OPENAI_API_BASE_URL : 'https://api.openai.com' app.use('/mjapi',authV2 , proxy(process.env.MJ_SERVER?process.env.MJ_SERVER:'https://api.openai.com', { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl.replace('/mjapi', '') // 将URL中的 `/mjapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { if( process.env.MJ_API_SECRET ) proxyReqOpts.headers['mj-api-secret'] = process.env.MJ_API_SECRET; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, //limit: '10mb' })); // 设置存储引擎和文件保存路径 const storage = multer.diskStorage({ destination: function (req, file, cb) { let uploadFolderPath=`./uploads/${formattedDate()}/`;//` //console.log('dir', __dirname ) ; if(!fs.existsSync('./uploads/')) { fs.mkdirSync('./uploads/'); } if(!fs.existsSync(uploadFolderPath)) { fs.mkdirSync(uploadFolderPath); } cb(null, `uploads/${formattedDate()}/`); }, filename: function (req, file, cb) { let filename= Date.now() + path.extname(file.originalname); console.log( 'file', filename ); cb(null, filename); } }); const upload = multer({ storage: storage }); const storage2 = multer.memoryStorage(); const upload2 = multer({ storage: storage2 }); // 处理文件上传的路由 const isUpload= isNotEmptyString( process.env.API_UPLOADER ) if(isUpload){ if( process.env.FILE_SERVER){ app.use('/openapi/v1/upload', upload2.single('file'), async (req, res, next) => { //console.log( "boday",req.body , req.body.model ); if(req.file.buffer) { const fileBuffer = req.file.buffer; const formData = new FormData(); formData.append('file', fileBuffer, { filename: req.file.originalname } ); //formData.append('model', req.body.model ); try{ let url = process.env.FILE_SERVER ; let responseBody = await axios.post( url , formData, { headers: { //Authorization: 'Bearer '+ process.env.OPENAI_API_KEY , 'Content-Type': 'multipart/form-data' } }) ; res.json(responseBody.data ); }catch(e){ res.status( 400 ).json( {error: e } ); } }else{ res.status(400).json({'error':'uploader fail'}); } } ); } else{ app.use('/openapi/v1/upload', authV2, upload.single('file'), (req, res) => { //res.send('文件上传成功!'); res.setHeader('Content-type', 'application/json' ); if(req.file.filename) res.json({ url:`/uploads/${formattedDate()}/${ req.file.filename }`,created:Date.now() }) else res.json({ error:`uploader fail`,created:Date.now() }) }); } }else { app.use('/openapi/v1/upload', (req, res) => { //res.send('文件上传成功!'); res.json({ error:`server is no open uploader `,created:Date.now() }) }); } app.use('/uploads' , express.static('uploads')); // R2Client function const R2Client = () => { const accountId = process.env.R2_ACCOUNT_ID; const accessKeyId = process.env.R2_KEY_ID; const accessKeySecret = process.env.R2_KEY_SECRET; const endpoint = new AWS.Endpoint(`https://${accountId}.r2.cloudflarestorage.com`); const s3 = new AWS.S3({ endpoint: endpoint, region: 'auto', credentials: new AWS.Credentials(accessKeyId, accessKeySecret), signatureVersion: 'v4', }); return s3; }; // cloudflare R2 upload app.post('/openapi/pre_signed', (req, res) => { const bucketName = process.env.R2_BUCKET_NAME; const domain = process.env.R2_DOMAIN; const s3 = R2Client(); const fileName = uuidv4(); const saveFile = `${new Date().toISOString().split('T')[0]}/${fileName}${req.body.file_name}`; const params = { Bucket: bucketName, Key: saveFile, ContentType: req.body.ContentType, Expires: 60 * 60, // 1 hour }; s3.getSignedUrl('putObject', params, (err, url) => { if (err) { res.status(500).json({ status: 'Error', message: `Couldn't get presigned URL for PutObject: ${err.message}` }); return; } res.json({ status: 'Success', message: '', data: { up: url, url: `${domain}/${saveFile}` } }); }); }); app.use( '/openapi/v1/audio/transcriptions',authV2, upload2.single('file'), async (req, res, next) => { //console.log( "boday",req.body , req.body.model ); if(req.file.buffer) { const fileBuffer = req.file.buffer; const formData = new FormData(); formData.append('file', fileBuffer, { filename: req.file.originalname } ); formData.append('model', req.body.model ); try{ let url = `${API_BASE_URL}/v1/audio/transcriptions` ; let responseBody = await axios.post( url , formData, { headers: { Authorization: 'Bearer '+ process.env.OPENAI_API_KEY , 'Content-Type': 'multipart/form-data', 'Mj-Version': pkg.version } }) ; // console.log('responseBody', responseBody.data ); res.json(responseBody.data ); }catch(e){ //console.log('goog',e ); res.status( 400 ).json( {error: e } ); } }else{ res.status(400).json({'error':'uploader fail'}); } } ); //代理图片编辑 app.use('/openapi/v1/images/edits',authV2,upload2.any() , GptImageEdit ) //代理openai 接口 app.use('/openapi' ,authV2, turnstileCheck, proxy(API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl.replace('/openapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { proxyReqOpts.headers['Authorization'] ='Bearer '+ process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, //limit: '10mb' })); //代理sunoApi 接口 app.use('/sunoapi' ,authV2,sunoProxy ); app.use('/suno' ,authV2,sunoProxy ); //代理luma 接口 app.use('/luma' ,authV2, lumaProxy ); app.use('/pro/luma' ,authV2, lumaProxy ); //代理 viggle 文件 app.use('/viggle/asset',authV2 , upload2.single('file'), viggleProxyFileDo ); app.use('/pro/viggle/asset',authV2 , upload2.single('file'), viggleProxyFileDo ); //代理 viggle app.use('/viggle' ,authV2, viggleProxy); app.use('/pro/viggle' ,authV2, viggleProxy); app.use('/runwayml' ,authV2, runwaymlProxy ); app.use('/runway' ,authV2, runwayProxy ); app.use('/kling' ,authV2, klingProxy ); app.use('/ideogram/remix' ,authV2, upload2.single('image_file'), ideoProxyFileDo ); app.use('/ideogram' ,authV2, ideoProxy ); app.use('/pika' ,authV2, pikaProxy ); app.use('/udio' ,authV2, udioProxy ); app.use('/pixverse' ,authV2, pixverseProxy ); // WebDAV 代理接口 router.post('/webdav-proxy', authV2, async (req, res) => { try { const { url, method, username, password, data } = req.body if (!url || !method || !username || !password) { return res.status(400).json({ error: '缺少必要参数' }) } const auth = Buffer.from(`${username}:${password}`).toString('base64') const headers: any = { 'Authorization': `Basic ${auth}`, } if (method === 'PUT') { headers['Content-Type'] = 'application/json' } const axiosConfig: any = { method, url, headers, timeout: 30000, } if (method === 'PUT' && data) { axiosConfig.data = data } const response = await axios(axiosConfig) res.json({ success: true, status: response.status, data: response.data }) } catch (error: any) { res.status(error.response?.status || 500).json({ success: false, error: error.message, status: error.response?.status }) } }) app.use('', router) app.use('/api', router) app.set('trust proxy', 1) app.listen(3002, () => globalThis.console.log('Server is running on port 3002')) ================================================ FILE: service/src/middleware/auth.ts ================================================ import { isNotEmptyString } from '../utils/is' import { Request, Response, NextFunction } from 'express'; import FormData from 'form-data'; import fetch from 'node-fetch'; import md5 from 'md5'; // 存储IP地址和错误计数的字典 const ipErrorCount = {}; // 存储被禁止登录的IP地址及禁止结束时间的字典 const bannedIPs = {}; export const mlog =(...arg)=>{ //const M_DEBUG = process.env.M_DEBUG // if(['error','log'].indexOf( arg[0] )>-1 ){ //必须显示的 // }else if(! isNotEmptyString(process.env.M_DEBUG) ) return ; const currentDate = new Date(); const hours = currentDate.getHours().toString().padStart(2, '0'); const minutes = currentDate.getMinutes().toString().padStart(2, '0'); const seconds = currentDate.getSeconds().toString().padStart(2, '0'); const currentTime = `${hours}:${minutes}:${seconds}`; console.log( currentTime,...arg) } export const verify= async ( req :Request , res:Response ) => { try { checkLimit( req, res ); const { token } = req.body as { token: string } if (!token) throw new Error('Secret key is empty') const auth_secret_keys = process.env.AUTH_SECRET_KEY? process.env.AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''):[]; if (!auth_secret_keys.includes(token)) throw new Error('密钥无效 | Secret key is invalid') clearLimit( req, res); res.send({ status: 'Success', message: 'Verify successfully', data: null }) } catch (error) { res.send({ status: 'Fail', message: error.message, data: null }) } } export const auth = async ( req :Request , res:Response , next:NextFunction ) => { const AUTH_SECRET_KEY = process.env.AUTH_SECRET_KEY if (isNotEmptyString(AUTH_SECRET_KEY)) { try { checkLimit( req, res ); const Authorization = req.header('Authorization') //const auth_secret_keys = process.env.AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''); const auth_secret_keys = process.env.AUTH_SECRET_KEY? process.env.AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''):[]; if (!Authorization || !auth_secret_keys.includes(Authorization.replace('Bearer ', '').trim())) throw new Error('Error: 无访问权限 | No access rights') clearLimit( req, res); next() } catch (error) { res.send({ status: 'Unauthorized', message: error.message ?? 'Please authenticate.', data: null }) } } else { next() } } const getIp= ( req :Request)=>{ if (req.header && req.header('x-forwarded-for')) return req.header('x-forwarded-for'); return req.ip; } const checkLimit= ( req :Request , res:Response )=>{ if ( !isNotEmptyString( process.env.AUTH_SECRET_ERROR_COUNT )) { return ; } const bTime = process.env.AUTH_SECRET_ERROR_TIME??10; // 允许的最大错误次数 const maxErrorCount = +process.env.AUTH_SECRET_ERROR_COUNT; // 禁止登录的时间(毫秒) let banTime = (+bTime) * 60*1000; // 10分钟 if( banTime<=0 ) banTime= 10*60*1000; const ipAddress =getIp(req); if (bannedIPs[ipAddress] && Date.now() < bannedIPs[ipAddress]) { const timeLeft = Math.ceil((bannedIPs[ipAddress] - Date.now()) / 1000); console.log("myIP ",ipAddress, ipErrorCount[ipAddress] ); //return res.status(403).send(`IP地址被禁止登录,剩余时间: ${timeLeft}秒`); let ts = timeLeft>60? (timeLeft/60).toFixed(0)+'分钟': timeLeft+'秒' throw new Error(`Error: ${ipAddress} 验证次数过多,请在${ts}后重试!`) } ipErrorCount[ipAddress] = ipErrorCount[ipAddress]?( ipErrorCount[ipAddress]+1) : 1; if (ipErrorCount[ipAddress] >= maxErrorCount) { bannedIPs[ipAddress] = Date.now() + banTime; } } const clearLimit= ( req :Request , res:Response )=>{ const ipAddress =getIp(req); bannedIPs[ipAddress] = 0; ipErrorCount[ipAddress]= 0; } export const authV2 = async ( req :Request , res:Response , next:NextFunction ) => { const AUTH_SECRET_KEY = process.env.AUTH_SECRET_KEY //const auth_secret_keys = AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''); const auth_secret_keys = process.env.AUTH_SECRET_KEY? process.env.AUTH_SECRET_KEY.trim().split(',').filter(item => item !== ''):[]; if (isNotEmptyString(AUTH_SECRET_KEY)) { try { checkLimit( req, res ); const Authorization = req.header('X-Ptoken') if ( !Authorization || !auth_secret_keys.includes(Authorization.trim())) throw new Error('Error: 无访问权限 | No access rights') clearLimit( req, res); next() //throw new Error('Error: 无访问权限 | No access rights') } catch (error) { res.status(423); res.send({ code: 'token_check', message: error.message ?? 'Please authenticate.', data: null }) } } else { next() } } export const turnstileCheck= async ( req :Request , res:Response , next:NextFunction ) => { const TURNSTILE_SITE = process.env.TURNSTILE_SITE if (!isNotEmptyString(TURNSTILE_SITE)) { next(); return ; } //TURNSTILE_NO_CHECK if ( isNotEmptyString( process.env.TURNSTILE_NO_CHECK)) { //前端显示当时后端不check next(); return ; } try{ if( checkCookie( req ) ) { next(); return ; } const Authorization = req.header('X-Vtoken') if ( !Authorization ) throw new Error('无权限访问,请刷新重试 | No access rights by Turnstile') const SECRET_KEY= process.env.TURNSTILE_SECRET_KEY let formData = new FormData(); formData.append('secret', SECRET_KEY); formData.append('response', Authorization); //formData.append('remoteip', ip); const result = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { body: formData, method: 'POST', }); const outcome:any = await result.json(); //console.log('outcome>> ', outcome ); if (!outcome.success) throw new Error('无权限访问,请刷新重试 | No access rights by Turnstile') next(); }catch (error) { res.status(422); mlog( 'Turnstile_Error') res.send({ code: 'Turnstile_Error', message: error.message ?? 'Please authenticate.' }) } //throw new Error('Error: 无访问权限 | No access rights by Turnstile') } const getCookie=( time:string )=>{ return time+'_'+(md5(time + process.env.TURNSTILE_SECRET_KEY ).substring(0,10) ); } export const regCookie= async( req :Request , res:Response , next:NextFunction )=>{ try{ const Authorization = req.header('X-Vtoken') if ( !Authorization ) throw new Error('Turnstile token 缺失') const SECRET_KEY= process.env.TURNSTILE_SECRET_KEY let formData = new FormData(); formData.append('secret', SECRET_KEY); formData.append('response', Authorization); //formData.append('remoteip', ip); const result = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { body: formData, method: 'POST', }); const outcome:any = await result.json(); //console.log('outcome>> ', outcome ); if (!outcome.success) throw new Error('Turnstile 错误,请刷新重试 | No access rights by Turnstile') const now= `${ (Date.now()/1000).toFixed(0)}`; res.status(200); //req.cookies.username; //res.cookie('gptmj', getCookie( now ), { maxAge: 5*3600*1000, httpOnly: true }); res.send({ok:'ok' ,ctoken: getCookie( now ) }) }catch (error) { res.status(422); mlog('reg_cookie error '); res.send({ code: 'reg_cookie', message: error.message ?? 'Please authenticate.' }) } } const checkCookie= ( req :Request ):boolean=>{ //console.log( 'cookies : ', req.header('X-Ctoken') ); if( ! req.header('X-Ctoken')) return false; const gptmj = req.header('X-Ctoken') as string; if( gptmj==getCookie( gptmj.split('_')[0]) ) { mlog('cookie ok '); return true; } return false; } ///export { auth } ================================================ FILE: service/src/middleware/limiter.ts ================================================ import { rateLimit } from 'express-rate-limit' import { isNotEmptyString } from '../utils/is' const MAX_REQUEST_PER_HOUR = process.env.MAX_REQUEST_PER_HOUR const maxCount = (isNotEmptyString(MAX_REQUEST_PER_HOUR) && !isNaN(Number(MAX_REQUEST_PER_HOUR))) ? parseInt(MAX_REQUEST_PER_HOUR) : 0 // 0 means unlimited const limiter = rateLimit({ windowMs: 60 * 60 * 1000, // Maximum number of accesses within an hour max: maxCount, statusCode: 200, // 200 means success,but the message is 'Too many request from this IP in 1 hour' message: async (req, res) => { res.send({ status: 'Fail', message: 'Too many request from this IP in 1 hour', data: null }) }, }) export { limiter } ================================================ FILE: service/src/myfun.ts ================================================ import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; import { isNotEmptyString } from './utils/is'; import FormData from 'form-data' import proxy from "express-http-proxy" import pkg from '../package.json' const API_BASE_URL = isNotEmptyString(process.env.OPENAI_API_BASE_URL) ? process.env.OPENAI_API_BASE_URL : 'https://api.openai.com' export const lumaProxy=proxy(process.env.LUMA_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.LUMA_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.LUMA_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }); export const runwayProxy=proxy(process.env.RUNWAY_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.RUNWAY_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.RUNWAY_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }); //runwaymlProxy export const runwaymlProxy=proxy(process.env.RUNWAYML_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { let url = req.originalUrl; let server= process.env.RUNWAYML_SERVER?? API_BASE_URL if( server.indexOf('runwayml.com')>-1 ){ url= req.originalUrl.replace('/runwayml', '') } return url //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.RUNWAYML_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.RUNWAYML_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; proxyReqOpts.headers['X-Runway-Version'] = '2024-11-06'; //'X-Runway-Version': return proxyReqOpts; }, }); export const klingProxy=proxy(process.env.KLING_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.KLING_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.KLING_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }); export const viggleProxy=proxy(process.env.VIGGLE_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.VIGGLE_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.VIGGLE_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) export const ideoProxy=proxy(process.env.IDEO_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { if ( process.env.IDEO_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.IDEO_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) export const pikaProxy=proxy(process.env.PIKA_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { if ( process.env.PIKA_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.PIKA_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) export const pixverseProxy=proxy(process.env.PIXVERSE_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { if ( process.env.PIXVERSE_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.PIXVERSE_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) export const udioProxy=proxy(process.env.UDIO_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl //req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { if ( process.env.UDIO_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.UDIO_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) //req, res, next export const ideoProxyFileDo=async( req:Request, res:Response, next?:NextFunction)=>{ console.log('req.originalUrl', req.originalUrl ); let API_BASE_URL = isNotEmptyString(process.env.OPENAI_API_BASE_URL) ? process.env.OPENAI_API_BASE_URL : 'https://api.openai.com' API_BASE_URL= process.env.IDEO_SERVER?? API_BASE_URL if(req.file.buffer) { const fileBuffer = req.file.buffer; const formData = new FormData(); formData.append('image_file', fileBuffer, { filename: req.file.originalname } ); formData.append('image_request', req.body.image_request ); try{ let url = `${API_BASE_URL}${req.originalUrl}` ; let responseBody = await axios.post( url , formData, { headers: { Authorization: 'Bearer '+ (process.env.IDEO_KEY??process.env.OPENAI_API_KEY) , 'Content-Type': 'multipart/form-data', //'Mj-Version': pkg.version } }) ; res.json(responseBody.data ); }catch(e){ res.status( 400 ).json( {error: e } ); } }else{ res.status(400).json({'error':'uploader fail'}); } } export const viggleProxyFileDo= async( req:Request, res:Response, next?:NextFunction)=>{ // if ( process.env.VIGGLE_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.VIGGLE_KEY; // else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; console.log('req.originalUrl', req.originalUrl ); let API_BASE_URL = isNotEmptyString(process.env.OPENAI_API_BASE_URL) ? process.env.OPENAI_API_BASE_URL : 'https://api.openai.com' API_BASE_URL= process.env.VIGGLE_SERVER?? API_BASE_URL if(req.file.buffer) { const fileBuffer = req.file.buffer; const formData = new FormData(); formData.append('file', fileBuffer, { filename: req.file.originalname } ); // formData.append('model', req.body.model ); try{ let url = `${API_BASE_URL}${req.originalUrl}` ; let responseBody = await axios.post( url , formData, { headers: { Authorization: 'Bearer '+ (process.env.VIGGLE_KEY??process.env.OPENAI_API_KEY) , 'Content-Type': 'multipart/form-data', //'Mj-Version': pkg.version } }) ; res.json(responseBody.data ); }catch(e){ res.status( 400 ).json( {error: e } ); } }else{ res.status(400).json({'error':'uploader fail'}); } } export const sunoProxy=proxy(process.env.SUNO_SERVER?? API_BASE_URL, { https: false, limit: '10mb', proxyReqPathResolver: function (req) { return req.originalUrl.replace('/sunoapi', '') // 将URL中的 `/openapi` 替换为空字符串 }, proxyReqOptDecorator: function (proxyReqOpts, srcReq) { //mlog("sunoapi") if ( process.env.SUNO_KEY ) proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.SUNO_KEY; else proxyReqOpts.headers['Authorization'] ='Bearer '+process.env.OPENAI_API_KEY; proxyReqOpts.headers['Content-Type'] = 'application/json'; proxyReqOpts.headers['Mj-Version'] = pkg.version; return proxyReqOpts; }, }) //主要转发接口 export const GptImageEdit = async ( request: Request, response: Response, next?: NextFunction ) => { try { doGptImageEdit(request, response, next); } catch (e) { //mlog("error", "gpt.image.edit /v1/images/edits", e); } }; const doGptImageEdit = async ( req: Request, res: Response, next?: NextFunction ) => { const formData = new FormData(); const request = req; const response = res; const dd = { }; let url = API_BASE_URL let myKey =process.env.OPENAI_API_KEY;; // 添加其他字段 try { for (let o in req.body) { try { //mlog("body2 ", o); formData.append(o, req.body[o]); } catch (error) { //mlog("body error", o); } } if (req.files) { // 处理上传的文件 req.files.forEach((file) => { // 判断是单文件还是多文件上传 //mlog("fileName >>", file.fieldname); formData.append(file.fieldname, file.buffer, { filename: file.originalname, contentType: file.mimetype, }); }); } //验证IP百名单 //await checkWhileIp( +mykey.user.uid,request ); let rqUrl = url + "/v1/images/edits"; let responseBody = await axios.post(rqUrl, formData, { headers: { Authorization: 'Bearer '+ myKey, "Content-Type": "multipart/form-data", }, }); res.status(responseBody.status).send(responseBody.data); const ss = { ...responseBody.data }; if (ss.data && ss.data.length > 0) { for (let i = 0; i < ss.data.length; i++) { let o = ss.data[i]; if (o.b64_json) { o.b64_json = "yes"; } ss.data[i] = o; } } //dd.data = ss; //dd.status = responseBody.status; } catch (error) { if (error.response) { let responseBody = error.response; //let data = error.response.data; let dddata = responseBody.data ?? { dtail: "openai_hk_error" }; let status = responseBody.status ?? 428; res.status( status ).send(dddata); } else { response.writeHead(405); let ss = error ? JSON.stringify(error) : "gate way error..."; response.end( `{"error":{"message":"${ss}","type":"openai_hk_error","code":"gate_way_error"}}` ); } } //http2mq("gpt-image-edit", dd); }; ================================================ FILE: service/src/types.ts ================================================ import type { FetchFn } from 'chatgpt' export interface RequestProps { prompt: string options?: ChatContext systemMessage: string temperature?: number top_p?: number } export interface ChatContext { conversationId?: string parentMessageId?: string } export interface ChatGPTUnofficialProxyAPIOptions { accessToken: string apiReverseProxyUrl?: string model?: string debug?: boolean headers?: Record fetch?: FetchFn } export interface ModelConfig { apiModel?: ApiModel reverseProxy?: string timeoutMs?: number socksProxy?: string httpsProxy?: string usage?: string } export type ApiModel = 'ChatGPTAPI' | 'ChatGPTUnofficialProxyAPI' | undefined ================================================ FILE: service/src/utils/index.ts ================================================ interface SendResponseOptions { type: 'Success' | 'Fail' message?: string data?: T } export function sendResponse(options: SendResponseOptions) { if (options.type === 'Success') { return Promise.resolve({ message: options.message ?? null, data: options.data ?? null, status: options.type, }) } // eslint-disable-next-line prefer-promise-reject-errors return Promise.reject({ message: options.message ?? 'Failed', data: options.data ?? null, status: options.type, }) } ================================================ FILE: service/src/utils/is.ts ================================================ export function isNumber(value: T | unknown): value is number { return Object.prototype.toString.call(value) === '[object Number]' } export function isString(value: T | unknown): value is string { return Object.prototype.toString.call(value) === '[object String]' } export function isNotEmptyString(value: any): boolean { return typeof value === 'string' && value.length > 0 } export function isBoolean(value: T | unknown): value is boolean { return Object.prototype.toString.call(value) === '[object Boolean]' } export function isFunction any | void | never>(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Function]' } export const formattedDate=()=>{ const currentDate = new Date(); const year = currentDate.getFullYear(); const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); const day = currentDate.getDate().toString().padStart(2, '0'); return `${year}${month}${day}`; } ================================================ FILE: service/tsconfig.json ================================================ { "compilerOptions": { "target": "es2020", "lib": [ "esnext" ], "allowJs": true, "skipLibCheck": true, "strict": false, "forceConsistentCasingInFileNames": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "baseUrl": ".", "outDir": "build", "noEmit": true }, "exclude": [ "node_modules", "build" ], "include": [ "**/*.ts" ] } ================================================ FILE: service/tsup.config.ts ================================================ import { defineConfig } from 'tsup' export default defineConfig({ entry: ['src/index.ts'], outDir: 'build', target: 'es2020', format: ['esm'], splitting: false, sourcemap: true, minify: false, shims: true, dts: false, }) ================================================ FILE: src/App.vue ================================================ ================================================ FILE: src/api/Recognition.ts ================================================ import { mlog } from "./mjapi"; export interface recType{ timeOut:number asrLanguage?:string listener?: (result: string) => void onEnd?: () => void onStart?: () => void } export class Recognition { private recognition: any; private listener?: (result: string) => void; private isStop = false; //选项 private recOpt:recType={timeOut:2000} // private handleTime: any ; private hTime:Date | undefined; //语言 private asrLanguage = 'cmn-Hans-CN' // private onEnd?: () => void; private onStart?: () => void; public setListener(fn: (result: string) => void) { this.listener = fn; return this; } public setOnEnd( fn: ( ) => void){ this.onEnd = fn; return this; } public setOpt( opt:recType ){ this.recOpt= opt; if(opt.listener) this.setListener(opt.listener) if(opt.onEnd) this.setListener(opt.onEnd) if(opt.asrLanguage) this.setLang(opt.asrLanguage); if(opt.onStart) this.onStart= opt.onStart; return this; } public setLang( lang:string ){ this.asrLanguage = lang; return this; } public start() { this.isStop = false; // @ts-ignore if (!window.SpeechRecognition && !window.webkitSpeechRecognition) return; if (!this.recognition) { // @ts-ignore const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); this.recognition = recognition; } const recognition = this.recognition; // 返回实时识别结果 recognition.interimResults = true; // 设置语言 const lang = this.asrLanguage; recognition.lang = lang; // 设置是否连续识别 recognition.continuous = true; this.hTime = new Date(); this.handleTime = setInterval( ()=>this.check( this ), this.recOpt.timeOut ) // 当识别到语音时触发该事件 recognition.addEventListener('result', (event: any) => { let transcript = ''; for (let index = 0; index < event.results.length; index++) { const item = event.results[index]; // 中文添加逗号 if (transcript && lang?.includes('Han')) transcript += ','; transcript += (item as unknown as SpeechRecognitionAlternative[])[0]?.transcript; } if (!transcript) return; this.hTime = new Date(); this.listener?.(transcript); }); // 当识别结束时触发该事件 recognition.addEventListener('end', () => { mlog('recognition onEnd', this.isStop ); if (this.isStop) { this.onEnd?.(); this.handleTime && clearInterval( this.handleTime ) return; } // 继续监听 recognition.start(); }); // 启动语音识别 recognition.start(); this.onStart?.(); return this; } public stop() { this.isStop = true; this.recognition?.stop(); return this; } private check( that:Recognition ){ if( !that.hTime ) { mlog('mcheck 未定义'); return ; } const nTime = new Date(); const dt = nTime.getTime()- that.hTime.getTime(); mlog('mcheck', dt,that.recOpt.timeOut ); if( dt> that.recOpt.timeOut ){ that.stop(); } return this; } } export const supportLanguages: Record = { 'cmn-Hans-CN': '普通话 (中国大陆)', 'cmn-Hans-HK': '普通话 (香港)', 'yue-Hant-HK': '粵語 (香港)', 'en-US': 'English(United States)', 'en-GB': 'English(United Kingdom)', 'en-IN': 'English(India)', 'es-ES': 'Español', 'fr-FR': 'Français', 'de-DE': 'Deutsch', 'it-IT': 'Italiano', 'ja-JP': '日本語', 'ko-KR': '한국어', 'ar-SA': 'العربية', 'pt-BR': 'Português', 'ru-RU': 'Русский', 'nl-NL': 'Nederlands', 'tr-TR': 'Türkçe', 'sv-SE': 'Svenska', 'hi-IN': 'हिन्दी', 'el-GR': 'Ελληνικά', 'he-IL': 'עברית', 'id-ID': 'Bahasa Indonesia', 'pl-PL': 'Polski', 'th-TH': 'ไทย', 'cs-CZ': 'Čeština', 'hu-HU': 'Magyar', 'da-DK': 'Dansk', 'fi-FI': 'Suomi', 'no-NO': 'Norsk', 'sk-SK': 'Slovenčina', 'uk-UA': 'Українська', 'vi-VN': 'Tiếng Việt', }; function sleep(time: number) { return new Promise((resolve) => setTimeout(resolve, time)); } //浏览器文字播放 export async function speakText(content: string, callback: (playing: boolean) => void) { if (!window.speechSynthesis) return; if (speechSynthesis.speaking) { speechSynthesis.cancel(); callback(false); } await sleep(300); const msg = new SpeechSynthesisUtterance(content); msg.lang = 'zh'; msg.rate = 1; msg.addEventListener('end', () => { callback(false); }); msg.addEventListener('error', () => { callback(false); }); callback(true); speechSynthesis.speak(msg); } ================================================ FILE: src/api/chat.ts ================================================ //import { reactive } from 'vue' import { gptConfigStore, gptConfigType } from "@/store"; import { ss } from '@/utils/storage' import { mlog } from "./mjapi"; import { debounce } from "@/utils/functions/debounce"; //let time_limit= 0 export class chatSetting{ private uuid: number; private localKey='chat-setting'; private time_limit=0; private mObj:gptConfigType[]=[]; //private gptConfig: gptConfigType // 构造函数 constructor(uuid: number) { this.uuid = uuid; //this.gptConfig = gptConfigStore.myData; //this.init(); } public setUuid(uuid: number){ this.uuid = uuid; return this } public getGptConfig():gptConfigType { mlog("toMyuid16","getGptConfig", this.uuid ) const index = this.findIndex(); if( index<=-1) return gptConfigStore.myData; const arr = this.getObjs(); const rz= arr[index]; //gptConfigStore.setMyData( rz ); gptConfigStore.myData.model= rz.model; return rz; } public getObjsDebounce=debounce( this.getObjs ,600); //卡死 可疑点 public getObjs():gptConfigType[]{ const now= Math.floor(Date.now() / 1) const dt= now- this.time_limit; mlog("toMyuid15","getObjs", this.uuid , dt) if(dt<500 ){ //防止卡死 return this.mObj ; } this.time_limit=now ; const obj = ss.get( this.localKey ) as undefined| gptConfigType[]; this.mObj= obj? obj:[] return this.mObj; } public findIndex(){ mlog("toMyuid8","findIndex") return this.getObjs().findIndex(v=>v.uuid && v.uuid==this.uuid ) } public save( obj : Partial){ mlog("toMyuid8","save") let sobj ={ ...gptConfigStore.myData , ...obj }; sobj.uuid= this.uuid; const index = this.findIndex(); let arr = this.getObjs(); if( index>-1 )arr[index]= sobj; else arr.push( sobj ); ss.set(this.localKey, arr ); return this ; } } ================================================ FILE: src/api/dtoStore.ts ================================================ import { ss } from "@/utils/storage"; export interface DtoItem{ url?:string status:string last_feed:number //最后更新时间 mid:string id:string //这个是唯一ID type:string //image video images data?:any //这个是返回全部数据 plat:string title:string, model?:string } export class DtoStore{ private localKey='dto-store'; public save(obj:DtoItem ){ if(!obj.id) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id == id ) } public getObjs():DtoItem[]{ const obj = ss.get( this.localKey ) as undefined| DtoItem[]; if(!obj) return []; return obj; } public getOneById(id:string):DtoItem|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( id:string ){ //if(!obj.data.task_id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/ideo.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sleep } from "./suno"; export interface IdeoImageData { is_image_safe: boolean; prompt: string; resolution: string; seed: number; url: string; } function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.IDEO_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.IDEO_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= '';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.IDEO_SERVER){ return `${ gptServerStore.myData.IDEO_SERVER}${pro_prefix}/ideogram${url}`; } return `${pro_prefix}/ideogram${url}`; } export const ideoSubmit= async( data:any ):Promise=>{ let rz:IdeoImageData[] let rzdata:any={image_request:data.image_request} if(data.file) { //mlog('文件上传', data.file ); const formData = new FormData(); formData.append('image_file', data.file ) formData.append('image_request', JSON.stringify(data.image_request) ) let d:any = await ideoFetch( '/remix', formData,{upFile:true}) //mlog(' 文件上传 back', d ); rz= d.data as IdeoImageData[] }else{ let d:any = await ideoFetch('/generate ' ,rzdata ) //mlog('back', d ); rz= d.data as IdeoImageData[] } return rz; } export const ideoFetch=(url:string,data?:any,opt2?:any )=>{ mlog('ideoFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } // export async function FeedViggleTask(id:string){ // const ss = new viggleStore() // const hk= new lumaHkStore(); // const hkObj= hk.getOneById(id) // for(let i=0; i<500;i++){ // let url= '/video-task/by-ids'; // if(hkObj && hkObj.isHK ) url= '/pro/video-task/by-ids'; // const d= await viggleFetch(url,{ids:[id]}) // mlog('FeedViggleTask', d ) // if(d.data && d.data.length>0){ // let task= d.data[0] as ViggleTask; // task.last_feed=new Date().getTime() // ss.save( task ) // homeStore.setMyData({act:'FeedViggleTask'}) // if ( d.data[0].status==0) return // } // await sleep(2000) // } // } ================================================ FILE: src/api/index.ts ================================================ import type { AxiosProgressEvent, GenericAbortSignal } from 'axios' import { post } from '@/utils/request' import { homeStore, useAuthStore, useSettingStore } from '@/store' export function fetchChatAPI( prompt: string, options?: { conversationId?: string; parentMessageId?: string }, signal?: GenericAbortSignal, ) { return post({ url: '/chat', data: { prompt, options }, signal, }) } export function fetchChatConfig() { return post({ url: '/config', }) } export function fetchChatAPIProcess( params: { prompt: string options?: { conversationId?: string; parentMessageId?: string } signal?: GenericAbortSignal onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void }, ) { const settingStore = useSettingStore() const authStore = useAuthStore() let data: Record = { prompt: params.prompt, options: params.options, } if (authStore.isChatGPTAPI) { data = { ...data, systemMessage: settingStore.systemMessage, temperature: settingStore.temperature, top_p: settingStore.top_p, } } return post({ url: '/chat-process', data, signal: params.signal, onDownloadProgress: params.onDownloadProgress, }) } export function fetchSession() { if (homeStore.myData.isClient) return {"status":"Success","message":"","data":{"isHideServer":false,"isUpload":false,"auth":false,"model":"ChatGPTAPI","amodel":"gpt-4","isApiGallery":false,"cmodels":"","baiduId":"9d5fa7fc2f5fd585aa8fd3010d19be1e","googleId":"","notify":"","disableGpt4":"","isWsrv":"","uploadImgSize":"1","gptUrl":"","theme":"dark","isCloseMdPreview":false}} return post({ url: '/session', }) } export function fetchVerify(token: string) { return post({ url: '/verify', data: { token }, }) } export * from "./mjapi" export * from "./mjsave" export * from "./openapi" export * from "./units" export * from "./mic" export * from "./chat" export * from "./sse/fetchsse" export * from "./Recognition" export * from "./luma" export * from "./ideo" export * from "./realtime" ================================================ FILE: src/api/kling.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { KlingTask, klingStore } from "./klingStore"; import { sleep } from "./suno"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.KLING_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.KLING_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= '';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.KLING_SERVER ){ return `${ gptServerStore.myData.KLING_SERVER}${pro_prefix}/kling${url}`; } return `${pro_prefix}/kling${url}`; } export const klingFetch=(url:string,data?:any,opt2?:any )=>{ mlog('runwayFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const klingFeed= async(id:string,cat:string,prompt:string)=>{ const sunoS = new klingStore(); let url= '/v1/images/generations/' //images或videos if (cat=='text2video'){ url='/v1/videos/text2video/'; } if(cat=='image2video'){ url='/v1/videos/image2video/'; } url= url+id; for(let i=0; i<200;i++){ try{ let a= await klingFetch( url ) let task= a as KlingTask; task.last_feed=new Date().getTime() task.cat= cat if(prompt){ task.prompt= prompt } //ss.save( task ) //mlog("a",a ) sunoS.save( task ) homeStore.setMyData({act:'KlingFeed'}); if( task.data.task_status =='failed' || 'succeed'== task.data.task_status ){ break; } }catch(e){ break; } await sleep(5200) } } ================================================ FILE: src/api/klingStore.ts ================================================ import { ss } from "@/utils/storage"; export interface KlingTask { cat?: string //类别 prompt?: string //提示词 last_feed?: number //最后更新时间 code: number; message: string; request_id: string; data: { task_id: string; task_status: string; task_status_msg: string; created_at: number; updated_at: number; task_result?: { images: Array<{ index: number; url: string; }> | null; videos: Array<{ id: string; url: string; duration: string; }> | null; }; }; } export class klingStore{ //private id: string; private localKey='kling-store'; public save(obj:KlingTask ){ if(!obj.data.task_id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.data.task_id==obj.data.task_id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.data.task_id == id ) } public getObjs():KlingTask[]{ const obj = ss.get( this.localKey ) as undefined| KlingTask[]; if(!obj) return []; return obj; } public getOneById(id:string):KlingTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( id:string ){ //if(!obj.data.task_id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.data.task_id==id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/luma.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { LumaMedia, lumaHkStore, lumaStore } from "./lumaStore"; import { sleep } from "./suno"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.LUMA_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.LUMA_KEY } headers= {...headers, ...bmi } return headers } const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= url.indexOf('/pro')>-1?'/pro':'';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.LUMA_SERVER){ if(gptServerStore.myData.LUMA_SERVER.indexOf('/pro')>0){ return `${ gptServerStore.myData.LUMA_SERVER}/luma${url}`; } return `${ gptServerStore.myData.LUMA_SERVER}${pro_prefix}/luma${url}`; } return `${pro_prefix}/luma${url}`; } export const lumaFetch=(url:string,data?:any,opt2?:any )=>{ mlog('sunoFetch', url ); let headers= {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const FeedLumaTask= async(id:string)=>{ if(id=='')return ''; const lumaS = new lumaStore(); const hk= new lumaHkStore(); const hkObj= hk.getOneById(id) for(let i=0; i<120;i++){ let url= '/generations/'+id; if(hkObj && hkObj.isHK ) url= '/pro/generations/'+id; let d:LumaMedia = await lumaFetch( url ); if(d.id){ d.last_feed = new Date().getTime() lumaS.save(d); homeStore.setMyData({act:'FeedLumaTask'}); if( d.state=='completed' && d.video && d.video?.download_url ){ //有的时候 completed 但是 没链接 break; } } await sleep(5*1000); } } export const isHkServer=()=>{ const url= gptServerStore.myData.LUMA_SERVER.toLocaleLowerCase(); if(url!=''){ return (url.indexOf('hk')>-1 && url.indexOf('pro')==-1 ) ; } return (homeStore.myData.session && homeStore.myData.session.isHk) ; } ================================================ FILE: src/api/lumaStore.ts ================================================ import { ss } from '@/utils/storage' type LumaVideo = { url: string; width: number; height: number; thumbnail: string | null; download_url?: string; }; export type LumaMedia = { id: string; prompt: string; state: string; created_at?: string; video?: LumaVideo; liked?: boolean | null; estimate_wait_seconds?: number | null; last_feed?:number }; export class lumaStore{ //private id: string; private localKey='luma-store'; public save(obj:LumaMedia ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():LumaMedia[]{ const obj = ss.get( this.localKey ) as undefined| LumaMedia[]; if(!obj) return []; return obj; } public delete( obj:LumaMedia ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } export type LumaHk={ id: string isHK:boolean } export class lumaHkStore{ //private id: string; private localKey='luma-HK'; public save(obj:LumaHk ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():LumaHk[]{ const obj = ss.get( this.localKey ) as undefined| LumaHk[]; if(!obj) return []; return obj; } public getOneById(id:string):LumaHk|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } } ================================================ FILE: src/api/mic.ts ================================================ export const tts=(index:Number)=>{ } ================================================ FILE: src/api/mjapi.ts ================================================ //import { useChat } from '@/views/chat/hooks/useChat' import { gptConfigStore, gptServerStore, homeStore, useAuthStore } from "@/store"; import { copyToClip } from "@/utils/copy"; import { isNumber } from "@/utils/is"; import { localGet, localSaveAny } from "./mjsave"; import { t } from "@/locales"; //import { useMessage } from "naive-ui"; export interface gptsType{ gid:string name:string logo:string info:string use_cnt?:string bad?:string|number } //const { addChat, updateChat, updateChatSome, getChatByUuidAndIndex } = useChat() export function upImg(file:any ):Promise { const maxSize= homeStore.myData.session.uploadImgSize? (+homeStore.myData.session.uploadImgSize):5 return new Promise((h,r)=>{ const filename = file.name; if(file.size>(1024*1024 * maxSize)){ r(t('mjchat.no1m',{m:maxSize})) return ; } if (! (filename.endsWith('.jpg') || filename.endsWith('.gif') || filename.endsWith('.png') || filename.endsWith('.jpeg') )) { r(t('mjchat.imgExt') ); return ; } const reader = new FileReader(); // 当读取操作完成时触发该事件 //reader.onload = (e:any)=> st.value.fileBase64 = e.target.result; reader.onload = (e:any)=> h( e.target.result); reader.readAsDataURL(file); }) } export const clearImageBase64= ( str:string)=>{ let arr= str.split('base64,',2 ) return arr[1]??arr[0]; } export const file2blob= (selectedFile: any )=>{ return new Promise<{blob:Blob,filename:string}>((resolve, reject) => { const reader = new FileReader(); mlog('selectedFile', selectedFile ) reader.onload = function (event:any ) { // 将文件内容转换为 Blob const blob = new Blob([event.target.result], { type: selectedFile.type }); // 在这里可以使用生成的 Blob 对象 //console.log(blob); resolve({blob,filename:selectedFile.name }); }; reader.onerror = (e)=> reject(e); // 开始读取文件 reader.readAsArrayBuffer(selectedFile); }) } export const blob2file= ( blob:Blob,fileName:string )=>{ const file = new File([blob], fileName, { type: blob.type, lastModified: Date.now() }); return file; } export const isFileMp3= (filename:string )=>{ //let arr='.mp3, .mp4, .mpeg, .mpga, .m4a, .wav, .webm'.split(/[, ]+/ig); // 修复: https://github.com/Dooy/chatgpt-web-midjourney-proxy/issues/666 let arr='.mp3, .mpeg, .mpga, .m4a, .wav, .webm'.split(/[, ]+/ig); mlog('fileIsMp3', arr ); filename= filename.toLocaleLowerCase(); for(let ext of arr ){ if(filename.endsWith(ext)) return true; } return false; } function containsChinese(str:string ) { return false; //11.18 都不需要翻译 // var reg = /[\u4e00-\u9fa5]/g; // 匹配中文的正则表达式 // return reg.test(str); } export async function train( text:string){ return new Promise((resolve, reject) => { if( text.trim() =='') { reject( t('mjchat.placeInput')); return ; } if( !containsChinese(text.trim()) ){ resolve( text.trim() ); return ; } // myTranslate( text.trim()) // .then((d:any)=> resolve( d.content.replace(/[?.!]+$/, ""))) // .catch(( )=> reject('翻译发生错误')) resolve( text.trim() ) }) } export const mlog = (msg: string, ...args: unknown[]) => { //localStorage.setItem('debug',1 ) const logStyles = [ // 'padding: 4px 8px', // 'color: #fff', // 'border-radius: 3px', 'color:', ].join(';') const debug= localStorage.getItem('debug') if( !debug ) return ; const style = `${logStyles}${msg.includes('error') ? 'red' : '#dd9089'}` console.log(`%c[mjgpt]`, style, msg , ...args) } export const myTrim = (str: string, delimiter: string)=>{ // 构建正则表达式,使用动态的定界符 const regex = new RegExp(`^${delimiter}+|${delimiter}+$`, 'g'); // 使用正则表达式去除字符串两端的定界符 return str.replace(regex, ''); } function getHeaderApiSecret(){ if(!gptServerStore.myData.MJ_API_SECRET){ const authStore = useAuthStore() if( authStore.token ) return { 'x-ptoken': authStore.token }; return {} } return { 'mj-api-secret': gptServerStore.myData.MJ_API_SECRET } } const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; if(gptServerStore.myData.MJ_SERVER){ return `${ gptServerStore.myData.MJ_SERVER}${url}`; } return `/mjapi${url}`; } export const mjFetch=(url:string,data?:any)=>{ mlog('mjFetch2024', url ); let header = {'Content-Type':'application/json'}; header= {...header,...getHeaderApiSecret() } return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers=header; if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then(d2=>d2.json().then(d=> { if(d2.ok) resolve(d); else{ reject({error: d.error?? (d??'Network response was not ok!'),code:'response_fail',url:getUrl(url), status:d2.status }) } }).catch(e=>reject({error:e? e.toString() :'json_error',code:'json_error',url:getUrl(url) , status:d2.status })) ).catch(e=>reject({error:e? e.toString() :'fetch fail',data ,code:'fetch_fail',url:getUrl(url) })) }) } export const myFetch=(url:string,data?:any)=>{ //mlog('myFetch', url ); let header = {'Content-Type':'application/json'}; //header= {...header } return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers=header; if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then(d=>d.json().then(d=> resolve(d)) .catch(e=>reject(e))) .catch(e=>reject(e)) }) } export const my2Fetch=(url:string,data?:any)=>{ mlog('mjFetch', url ); let header = {'Content-Type':'application/json'}; //header= {...header } return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers=header; if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch((url), opt ) .then(d=>d.json().then(d=> resolve(d)) .catch(e=>reject(e))) .catch(e=>reject(e)) }) } export const flechTask= ( chat:Chat.Chat)=>{ let cnt=0; const check= async ()=>{ cnt++; if(!chat.mjID){ chat.text +="\n获取失败" ; chat.loading=false; homeStore.setMyData({act:'updateTask', actData:chat }); return ; } const ts= await mjFetch(`/mj/task/${chat.mjID}/fetch`); chat.opt= ts; chat.loading= (cnt>=99)?false:true; //chat.progress=ts.progress; if(ts.progress && ts.progress== "100%") chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); //"NOT_START" //["SUBMITTED","IN_PROGRESS"].indexOf(ts.status)>-1 if( ["FAILURE","SUCCESS"].indexOf(ts.status)==-1 && cnt<100 ){ setTimeout(() => check( ) , 5000 ) } mlog('task', ts.progress,ts, chat.uuid,chat.index ); } check(); } export const subTask= async (data:any, chat:Chat.Chat )=>{ let d:any; mlog('subTask', data ) try{ //return ; if( data.action &&data.action=='change' ){ //执行变化 d= await mjFetch('/mj/submit/change' , data.data ); }else if( data.action &&data.action=="CustomZoom") { //自定义变焦 d = await mjFetch('/mj/submit/action' , data.data ); if(d.result){ let bdata= data.maskData; bdata.taskId= d.result; d= await mjFetch('/mj/submit/modal' , bdata ); } }else if( data.action &&data.action=='mask') { //局部重绘 d = await mjFetch('/mj/submit/action' , data.data ); if(d.result){ let bdata= data.maskData; bdata.taskId= d.result; d= await mjFetch('/mj/submit/modal' , bdata ); } }else if( data.action &&data.action=='blend') { //blend d= await mjFetch('/mj/submit/blend' , data.data ); }else if( data.action &&data.action=='shorten') { //shorten d= await mjFetch('/mj/submit/shorten' , data.data ); // mlog('mjFetch shorten' , data ); }else if( data.action &&data.action=='face') { //换脸 d= await mjFetch('/mj/insight-face/swap' , data.data ); //mlog('换年服务', data.data ); //return; }else if( data.action && data.action=='mj.edit.image') { //图编辑 d= await mjFetch('/mj/submit/edits' , data.data ); }else if( data.action &&data.action=='mj.edit.video') { //图生视频 d= await mjFetch('/mj/submit/video' , data.data ); }else if( data.action &&data.action=='img2txt') { //图生文 d= await mjFetch('/mj/submit/describe' , data.data ); }else if( data.action &&data.action=='changeV2') { //执行动作! d= await mjFetch('/mj/submit/action' , data.data ); if (d.description&& d.description.indexOf('confirm')>-1){ d= await mjFetch('/mj/submit/modal' , { taskId:d.result, prompt: d.properties.finalPrompt??''} ); } }else { let toData = { "base64Array":data.fileBase64??[], "notifyHook": "", "prompt": data.drawText, "state": "", botType:'MID_JOURNEY' }; if(data.bot && data.bot=='NIJI_JOURNEY'){ toData.botType= data.bot; } d= await mjFetch('/mj/submit/imagine' ,toData ); mlog('submit',d ); //return ; } //mlog("subTask rz >> ", d ) if(d.code==21 ){ d= await mjFetch('/mj/submit/modal' , { taskId:d.result} ); } backOpt(d, chat); }catch(e:any ){ mlog('mjFetchError', e ) chat.text='失败!'+"\n```json\n"+JSON.stringify(e, null, 2)+"\n```\n"; chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); } //if( chat.uuid && chat.index) updateChat(chat.uuid,chat.index, chat) } const backOpt= (d:any, chat:Chat.Chat )=>{ if(d.code==1 || d.code==22){ chat.text= d.code==22? d.description :'提交成功!'; chat.mjID= d.result; flechTask( chat ) chat.loading=true; homeStore.setMyData({act:'updateChat', actData:chat }); //chat.m= d.result; }else{ chat.text='失败!'+"\n```json\n"+JSON.stringify(d, null, 2)+"\n```\n"; chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); } } export const mjSeed= async ( mjid:string )=>{ const ts= await mjFetch(`/mj/task/${mjid}/image-seed`); return ts; } export const getSeed = async (cchat:Chat.Chat,message:any )=>{ // const message = useMessage(); // let cchat = props.chat; if(!cchat.mjID ) return ; let seed=0 ; if(cchat.opt?.seed) seed =cchat.opt?.seed; else{ try{ message.info('获取中...'); const res:any = await mjSeed( cchat.mjID); seed= res.result; if(seed>0 ) { if ( cchat.opt ){ cchat.opt.seed = seed; homeStore.setMyData({act:'updateChat', actData:cchat }); } message.success('获取成功'); } } catch(e){ message.error('获取失败') } } mlog('getSeed',seed); if(seed>0 ) { await copyToClip(`${seed}`); message.success('复制seed成功'); } } export const getLastVersion= async ()=>{ const url='https://api.github.com/repos/Dooy/chatgpt-web-midjourney-proxy/tags?per_page=1'; const a= await myFetch(url); mlog('lastVersion', a ); return a; } export const canVisionModel= (model:string)=>{ mlog('canVisionModel ',model ); //['gpt-4-all','gpt-4-v'].indexOf(model)==-1 && model.indexOf('gpt-4-gizmo')==-1 if( ['gpt-4-all','gpt-4-v','gpt-4v','gpt-3.5-net','gpt-4o-all'].indexOf(model)>-1 ) return true; if(model.indexOf('-all')>-1 )return true; //各种all模型 if(model.indexOf('gpt-4-gizmo')>-1 )return true; // || model.indexOf('claude-3-opus')>-1cha return false; } export const isCanBase64Model=(model:string)=>{ //默认是支持 if( model.includes('gpt-3') || model=='gpt-4'){ return false } return true //gpt-4o //customVisionModel let arr=['gpt-4o','gemini','1.5','sonnet','opus','deepseek' ]; for( let m of arr){ if(model.indexOf(m)>-1) return true } if(model.indexOf('gpt-4o')>-1 || ( model.indexOf('gemini')>-1 && model.indexOf('1.5')>-1 ) ){ return true } //if(model.indexOf('sonnet')>-1 ) return true ; let visionArr=['gemini-pro-vision','gpt-4o-2024-08-06','gpt-4o-2024-11-20','gpt-4o','gpt-4o-2024-05-13','gpt-4o-mini','gpt-4o-mini-2024-07-18','gemini-pro-1.5','gpt-4-turbo','gpt-4-turbo-2024-04-09','gpt-4-vision-preview','luma-video','claude-3-5-sonnet-20240620' ,'claude-3-sonnet-20240229','claude-3-opus-20240229', defaultVisionModel() ] if( homeStore.myData.session.customVisionModel ){ homeStore.myData.session.customVisionModel.split(/[ ,]+/ig).map( (v:string)=>{ visionArr.push( v.toLocaleLowerCase() ) }); } return visionArr.indexOf(model)>-1 } export const canBase64Model= (model:string)=>{ if( isCanBase64Model(model)) return model; return defaultVisionModel(); } export const defaultVisionModel=()=>{ if( homeStore.myData.session && homeStore.myData.session.visionModel ){ return homeStore.myData.session.visionModel } return 'gpt-4-vision-preview' } export const isTTS= ( model:string )=>{ if(model.indexOf('tts-1')===0 )return true; return false ; } function isStringOnlyDigits(input: string): boolean { // 使用正则表达式检查字符串是否只包含数字 const regex = /^[0-9]+$/; return regex.test(input); } export const loadGallery = async ()=>{ let localKey= 'mj-list-condition'; const d2:any = await localGet(localKey); //mlog('d2',d2 , (Date.now()- d2.ctime)); if(d2 && (Date.now()- d2.ctime)<300*1000 ){ return d2.d as any[]; } let d = await mjFetch(`/mj/gallery`); //mlog('tsList', d.data.list ); if( !d.data.list || d.data.list.length ==0 ) return []; const list =d.data.list as any[]; const ids = list.filter(v=> isStringOnlyDigits(v.reqid)).map(v=> +v.reqid ) ; mlog('ids', ids ); if(ids.length==0) return []; ///mj/task/list-by-condition d= await mjFetch('/mj/task/list-by-condition',{ids } ); if( d.length>0 ) localSaveAny({ctime: Date.now(), d}, localKey); return d as any[] ; } //从剪贴板中读取文件 export function getFileFromClipboard(event:any ){ let rz=[]; if ( event.clipboardData || event.originalEvent ) { let clipboardData = (event.clipboardData || event.originalEvent.clipboardData); if (clipboardData.items) { let items = clipboardData.items; // mlog('getFileFromClipboard', items ); for (let i = 0; i < items.length; i++) { if (items[i].type.indexOf("image") !== -1 || items[i].kind === 'file') { //rz.push( await fileToBase64( items[i].getAsFile()) ); //mlog('fff', items[i] ); rz.push( items[i].getAsFile()) } } } } //console.log('passs>>' ,rz ); return rz; } ================================================ FILE: src/api/mjsave.ts ================================================ import { gptServerStore, homeStore } from "@/store"; import localforage from "localforage" import { mlog } from "./mjapi"; localforage.config({ driver : localforage.INDEXEDDB, // Force WebSQL; same as using setDriver() name : 'mj', version : 1.0, size : 4980736, // Size of database, in bytes. WebSQL-only for now. storeName : 'mjkv', // Should be alphanumeric, with underscores. description : 'some description' }); export async function saveImg( key:string, value:string ){ await localforage.setItem( key, value ) } export async function getImg( key:string ): Promise { return await localforage.getItem( key ) } //本地存储使用了 export const localSave= async ( key:string, value:any)=>{ await localforage.setItem( key, value ) } //本地存储获取 export const localGet= async( key:string )=>{ return await localforage.getItem( key ) } export const localSaveAny = async( value:any,key?:string )=>{ if(!key) key=`MJ:r:${Date.now()}:${Math.floor(Math.random() * 100)}` ; await localSave(key,value); return key; } export function img2base64(img:any) { let canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; let ctx = canvas.getContext('2d'); if( ! ctx) return ""; ctx.drawImage(img, 0, 0); return canvas.toDataURL('image/jpeg'); } export function url2base64More(url:string,key?:string){ return new Promise<{key:string,base64:string}>((resolve, reject) => { const img = new Image(); img.crossOrigin = "anonymous"; img.onload=()=>{ const base64 = img2base64(img) ; localSaveAny(base64,key).then(d=>resolve({key:d, base64})).catch(e=>reject(e)); } img.onerror=(e)=>reject(e); img.src = url; }); } export const url2base64= async (url:string,key?:string)=>{ try{ return await url2base64More (url,key); }catch(e){ return await url2base64More( wsrvUrl(url) ,key); } } export const wsrvUrl=(url:string)=>{ const arr = url.split(/([a-z\-]+)ttachments/ig, 3 ); if( arr.length==3){ url= `https://cdn.discordapp.com/${arr[1]}ttachments`+ arr[2]; } return `https://wsrv.nl/?url=`+ encodeURIComponent(url); } export const mjImgUrl= (url:string)=>{ if (gptServerStore.myData.MJ_CDN_WSRV || homeStore.myData.session.isWsrv ) return wsrvUrl(url); return url; } export const getMjAll= async ( ChatState:Chat.ChatState)=>{ let rz:Chat.Chat[]=[] ChatState.chat.forEach(v=>{ // mlog('uid>>', v.uuid ); v.data.forEach(chat=>{ if( chat.mjID ){ // mlog('MJID>> ',chat.mjID); rz.push(chat ); } }) }); return rz ; } ================================================ FILE: src/api/mp4img.ts ================================================ import { FFmpeg } from '@ffmpeg/ffmpeg' import type { LogEvent } from '@ffmpeg/ffmpeg/dist/esm/types' import { fetchFile, toBlobURL } from '@ffmpeg/util' import { mlog } from './mjapi' const baseURL = 'https://unpkg.com/@ffmpeg/core-mt@0.12.6/dist/esm' export async function myTestTranscode( vidoUrl:string) { mlog('vidoUrl>> ', vidoUrl ) const ffmpeg = new FFmpeg() //await ffmpeg.load(); //message.value = 'Loading ffmpeg-core.js' ffmpeg.on('log', ({ message: msg }: LogEvent) => { //message.value = msg mlog('FFmpeg', msg) }) mlog('FFmpegs url23 ' ) try{ await ffmpeg.load({ coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'), wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'), workerURL: await toBlobURL(`${baseURL}/ffmpeg-core.worker.js`, 'text/javascript') }) }catch(e){ mlog('FFmpegs url3 er ', e ) } //await ffmpeg.load(); mlog('FFmpegs url3 ' ) //message.value = 'Start transcoding' await ffmpeg.writeFile('input.mp4', await fetchFile(vidoUrl)) //await ffmpeg.exec(['-i', 'test.avi', 'test.mp4']) await ffmpeg.exec(['-sseof', '-3', '-i', 'input.mp4', '-update', '1', '-q:v', '1', 'last_frame.jpg']) //message.value = 'Complete transcoding' const data = await ffmpeg.readFile( 'last_frame.jpg') //const url = URL.createObjectURL(new Blob([data.buffer], { type: 'image/jpeg' })); const url = URL.createObjectURL(new Blob([(data as Uint8Array).buffer], { type: 'image/jpeg' } )) mlog('FFmpeg url ', url ) // 创建一个临时的元素 const a = document.createElement('a'); a.href = url; a.download ='last_frame.jpg'; // 设置下载文件的名称 // 将 元素添加到 DOM,然后触发点击事件以启动下载 document.body.appendChild(a); a.click(); // 触发下载后,从 DOM 中移除 元素,并释放 URL 对象 document.body.removeChild(a); URL.revokeObjectURL(url); } ================================================ FILE: src/api/openapi.ts ================================================ import { gptConfigStore, gptServerStore, homeStore,useAuthStore } from "@/store"; import { mlog,myTrim } from "./mjapi"; import { fetchSSE } from "./sse/fetchsse"; import axios from 'axios'; import { localGet, localSaveAny } from "./mjsave"; import { isNumber, isObject } from "@/utils/is"; import { t } from "@/locales"; import { ChatMessage } from "gpt-tokenizer/esm/GptEncoding"; import { chatSetting } from "./chat"; import { MessageApiInjection } from "naive-ui/es/message/src/MessageProvider"; import { ideoSubmit } from "./ideo"; import { error } from "console"; //import {encode, encodeChat} from "gpt-tokenizer" //import {encode, encodeChat} from "gpt-tokenizer/cjs/encoding/cl100k_base.js"; //import { get_encoding } from '@dqbd/tiktoken' //import FormData from 'form-data'; export const KnowledgeCutOffDate: Record = { default: "2021-09", "gpt-4-1106-preview": "2023-04", "gpt-4-0125-preview": "2023-12", "gpt-4-vision-preview": "2023-04", "gpt-4-turbo-2024-04-09": "2023-12", "gpt-4o-2024-05-13": "2023-10", "o1-preview-2024-09-12": "2023-10", "o1-preview": "2023-10", "o1": "2023-10", "o1-2024-12-17": "2023-10", "o1-mini": "2023-10", "o1-mini-2024-09-12": "2023-10", "gpt-4o": "2023-10", "gpt-4o-mini": "2023-10", "gpt-4o-mini-2024-07-18": "2023-10", "gpt-4o-2024-08-06": "2023-10", //chatgpt-4o-latest "chatgpt-4o-latest": "2023-10", "gpt-4o-2024-11-20": "2023-10", "gpt-4-turbo": "2023-12", "gpt-4-turbo-preview": "2023-12", "claude-3-opus-20240229": "2023-08", "claude-3-sonnet-20240229": "2023-08", "claude-3-haiku-20240307": "2023-08", "claude-3-5-sonnet-20240620": "2024-04", "claude-3-5-sonnet-20241022": "2024-04", "claude-3-7-sonnet-20250219": "2024-04", "gemini-pro": "2023-12", "gemini-pro-vision": "2023-12", "gpt-4.5-preview-2025-02-27": "2024-10", "gpt-4.5-preview": "2024-10", "deepseek-v3": "2023-12", "deepseek-r1": "2023-12", "gpt-5": "2024-10", "gpt-5-mini": "2024-06", "gpt-5-nano": "2024-06", "gemini-pro-1.5": "2024-04" }; const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; if(gptServerStore.myData.OPENAI_API_BASE_URL){ return `${ gptServerStore.myData.OPENAI_API_BASE_URL}${url}`; } return `/openapi${url}`; } export const gptGetUrl = getUrl export const gptFetch=(url:string,data?:any,opt2?:any )=>{ mlog('gptFetch', url ); let headers= {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then(d=>d.json().then(d=> resolve(d)) .catch(e=>reject(e))) .catch(e=>reject(e)) }) } export const regCookie= async (n:string )=>{ if( n=='' ) return ; //mlog('regCookie:', n) let headers= {'Content-Type':'application/json', 'x-vtoken':n } //headers={...headers,...getHeaderAuthorization()} let opt:RequestInit ={method:'GET'}; opt.headers= headers ; const ck= await new Promise((resolve, reject) => { fetch('/api/reg', opt ) .then(d=>d.json().then(d=> resolve(d)) .catch(e=>reject(e))) .catch(e=>reject(e)) }); homeStore.setMyData({ctoken:ck.ctoken }) mlog('regCookie:', ck,n ) } // 前端直传 cloudflare r2 function uploadR2(file: File) { return new Promise((resolve, reject) => { //预签名 axios.post(gptGetUrl("/pre_signed"), { file_name: file.name, content_type: file.type }, { headers: { 'Content-Type': 'application/json' } }).then(response => { if (response.data.status == "Success") { const signedUrl = response.data.data.up; //上传 fetch(signedUrl, { method: 'PUT', body: file, headers: { 'Content-Type': file.type, }, }).then(res2 => { if (res2.ok) { console.log('Upload successful!', response.data.data.url); return resolve({ url: response.data.data.url }); } else { return reject(res2) } }).catch(error => { return reject(error) }); } else { return reject(response.data); } } ).catch(error => reject(error)); }); } export const GptUploader = ( _url :string, FormData:FormData )=>{ //R2上传 const upLoaderR2= ()=>{ const file = FormData.get('file') as File; return uploadR2(file); } //执行上传 const uploadNomalDo = (url:string, headers:any)=>{ return new Promise((resolve, reject) => { axios.post( url , FormData, { headers }).then(response => resolve(response.data ) ).catch(error =>reject(error) ); }) } //除R2外默认流程 const uploadNomal= (url:string)=>{ url= gptServerStore.myData.UPLOADER_URL? gptServerStore.myData.UPLOADER_URL : gptGetUrl( url ); let headers= {'Content-Type': 'multipart/form-data' } if(gptServerStore.myData.OPENAI_API_BASE_URL && url.indexOf(gptServerStore.myData.OPENAI_API_BASE_URL)>-1 ) { headers={...headers,...getHeaderAuthorization()} }else{ const authStore = useAuthStore() if( authStore.token ) { const header2={ 'x-ptoken': authStore.token }; headers= {...headers, ...header2} } } if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken }; headers= {...headers, ...vtokenh} } return uploadNomalDo(url,headers ); } //处理上传流程 const uploadType= ( (homeStore.myData.session.uploadType??'') as string).toLocaleLowerCase() ; let headers= {'Content-Type': 'multipart/form-data' } //R2 if(uploadType=='r2' ){ return upLoaderR2(); //容器 }else if( uploadType=='container' ) { const authStore = useAuthStore() if( authStore.token ) { const header2={ 'x-ptoken': authStore.token }; headers= {...headers, ...header2} } let url= `/openapi${_url}` return uploadNomalDo(url,headers ); //前端API }else if( uploadType=='api' ) { headers={...headers,...getHeaderAuthorization()} let url= `${ gptServerStore.myData.OPENAI_API_BASE_URL}${_url}` return uploadNomalDo(url,headers ); //自定义链接 }else if( uploadType=='myurl' ) { return uploadNomalDo(_url,headers ); } //默认上传流程 if(homeStore.myData.session.isUploadR2){ return upLoaderR2(); } return uploadNomal( _url); } export const whisperUpload = ( FormData:FormData )=>{ const url = gptGetUrl('/v1/audio/transcriptions'); let headers= {'Content-Type': 'multipart/form-data' } headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { axios.post( url , FormData, { headers }).then(response => resolve(response.data ) ).catch(error =>reject(error) ); }) } //gpt 文件上传 /v1/image/edits export const gptUploadFile= (url :string, FormData:FormData)=>{ url= gptGetUrl( url); let headers= {'Content-Type': 'multipart/form-data' } headers={...headers,...getHeaderAuthorization()} return axios.post( url , FormData, { headers }) } export const subGPT= async (data:any, chat:Chat.Chat )=>{ let d:any; let action= data.action; // mlog("gp-image-1 base64Array ", data.base64Array ) //chat.myid= `${Date.now()}`; const isDall= action=='gpt.dall-e-3' || isDallImageModel( data.data?.model) || data.data?.model?.indexOf('banana') //if( action=='gpt.dall-e-3' && data.data && data.data.model && data.data.model.indexOf('ideogram')>-1 ){ //ideogram if( isDall && data.data && data.data.model && data.data.model.indexOf('ideogram')>-1 ){ //ideogram mlog("ddlog 数据 ", data.data ) try{ let d= await ideoSubmit(data.data ); mlog("ddlog 数据返回 ", d ) const rz = d[0]; chat.text= rz.prompt//rz.p??`图片已完成`; chat.opt={imageUrl:rz.url } ; chat.loading = false; homeStore.setMyData({act:'updateChat', actData:chat }); }catch(e){ //chat.text='失败!'+"\n```json\n"+JSON.stringify(d, null, 2)+"\n```\n"; chat.text='失败!'+"\n```json\n"+ e +"\n```\n"; chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); } }else if( isDall && data.data.base64Array!=undefined ){ //执行变化 mlog("gp-image-1 base64Array ",data.data , data.data.base64Array ) //let d= await gptFetch('/v1/images/edits', data.data); const formData = new FormData( ); for(let o in data.data ){ if(o=='base64Array'){ for(let f of data.data.base64Array){ formData.append('image[]', f.file ) } }else{ if(o=='size' && data.data[o]=='auto'){ continue; } formData.append(o, data.data[o]) } } mlog("formData ", formData ) //const jda= upd.data try { const ds = await gptUploadFile('/v1/images/edits', formData) const d=ds.data; if(ds.status!=200) throw "Fail with status:"+ ds.status //const d= jda; //mlog("gp-image-1 结果 ", d ) let key= 'dall:'+chat.myid; const rz : any= d.data[0]; if(rz.b64_json){ const base64='data:image/png;base64,'+rz.b64_json; await localSaveAny(base64,key) } chat.text= rz.revised_prompt??`图片已完成`; chat.opt={imageUrl:rz.url?rz.url: 'https://www.openai-hk.com/res/img/open.png' } ; chat.loading = false; homeStore.setMyData({act:'updateChat', actData:chat }); } catch (e) { chat.text='失败!'+"\n```json\n"+ (d?JSON.stringify(d, null, 2):e) +"\n```\n"; chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); } }else if( isDall ){ //执行变化 // chat.model= 'dall-e-3'; let d= await gptFetch('/v1/images/generations', data.data); try{ const rz : any= d.data[0]; let key= 'dall:'+chat.myid; if(rz.b64_json){ const base64='data:image/png;base64,'+rz.b64_json; await localSaveAny(base64,key) } chat.text= rz.revised_prompt??`图片已完成`; chat.opt={imageUrl:rz.url?rz.url: 'https://www.openai-hk.com/res/img/open.png' } ; chat.loading = false; homeStore.setMyData({act:'updateChat', actData:chat }); }catch(e){ //chat.text='失败!'+"\n```json\n"+JSON.stringify(d, null, 2)+"\n```\n"; chat.text='失败!'+"\n```json\n"+ (d?JSON.stringify(d, null, 2):e) +"\n```\n"; chat.loading=false; homeStore.setMyData({act:'updateChat', actData:chat }); } } } export const isDallImageModel =(model:string|undefined)=>{ if(!model) return false; if( model.indexOf('flux')>-1 ) return true; if( model.indexOf('ideogram')>-1 ) return true; if( model.indexOf('gpt-image')>-1 ) return true; return ['dall-e-2' ,'dall-e-3','ideogram' ].indexOf(model)>-1 } interface subModelType{ message:any[] onMessage:(d:{text:string,isFinish:boolean,isAll?:boolean})=>void onError?:(d?:any)=>void signal?:AbortSignal model?:string uuid?:string|number } function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.OPENAI_API_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.OPENAI_API_KEY } headers= {...headers, ...bmi } return headers } export const getSystemMessage = (uuid?:number )=>{ //KnowledgeCutOffDate let sysTem= gptConfigStore.myData.systemMessage; if( uuid ){ const chatS= new chatSetting(uuid); sysTem= chatS.getGptConfig().systemMessage ; } if( sysTem ) return sysTem; let model= gptConfigStore.myData.model?gptConfigStore.myData.model: "gpt-3.5-turbo"; let producer= 'You are ChatGPT, a large language model trained by OpenAI.' if(model.includes('claude')) producer= 'You are Claude, a large language model trained by Anthropic.'; if(model.includes('gemini')) producer= 'You are Gemini, a large language model trained by Google.'; if(model.includes('deepseek')) producer= 'You are DeepSeek, a large language model trained by DeepSeek.'; if(model.includes('grok')) producer= 'You are grok, a large language model trained by xAi.'; //用户自定义系统 if(homeStore.myData.session.systemMessage ) producer= homeStore.myData.session.systemMessage let DEFAULT_SYSTEM_TEMPLATE = `${producer}`; if ( KnowledgeCutOffDate[model] || model.indexOf('gpt-')>-1 )DEFAULT_SYSTEM_TEMPLATE+=` Knowledge cutoff: ${KnowledgeCutOffDate[model]??KnowledgeCutOffDate.default}` DEFAULT_SYSTEM_TEMPLATE+=` Current model: ${model} Current time: ${ new Date().toLocaleString()} Latex inline: $x^2$ Latex block: $$e=mc^2$$`; return DEFAULT_SYSTEM_TEMPLATE; } export const isNewModel=(model:string)=>{ return model.startsWith('o1-') || model.includes('gpt-5') } export const subModel= async (opt: subModelType)=>{ // let model= opt.model?? ( gptConfigStore.myData.model?gptConfigStore.myData.model: "gpt-3.5-turbo"); let max_tokens= gptConfigStore.myData.max_tokens; let temperature= 0.5; let top_p= 1; let presence_penalty= 0 , frequency_penalty=0; if(opt.uuid){ const chatSet= new chatSetting( +opt.uuid); const gStore= chatSet.getGptConfig(); temperature= gStore.temperature??temperature; top_p = gStore.top_p??top_p; presence_penalty = gStore.presence_penalty??presence_penalty; frequency_penalty = gStore.frequency_penalty??frequency_penalty; max_tokens= gStore.max_tokens; } if(model=='gpt-4-vision-preview' && max_tokens>2048) max_tokens=2048; //gptServerStore.myData.GPTS_GX if( gptServerStore.myData.GPTS_GX ){ model= model.replace('gpt-4-gizmo-','') } let body:any ={ max_tokens , model , // temperature, top_p, presence_penalty ,frequency_penalty, "messages": opt.message ,stream:true } if(isNewModel(model)){ body ={ max_completion_tokens:max_tokens , model , //temperature, top_p, presence_penalty ,frequency_penalty, "messages": opt.message ,stream:false } } if(body.stream){ let headers ={ 'Content-Type': 'application/json' //,'Authorization': 'Bearer ' +gptServerStore.myData.OPENAI_API_KEY ,'Accept': 'text/event-stream ' } headers={...headers,...getHeaderAuthorization()} try { let is_reasoning_content=false await fetchSSE( gptGetUrl('/v1/chat/completions'),{ method: 'POST', headers: headers, signal:opt.signal, onMessage: async (data:string)=> { //mlog('🐞测试' , data ) ; if(data=='[DONE]') opt.onMessage({text:'',isFinish:true}) else { const obj= JSON.parse(data ); if( obj.choices[0].delta?.reasoning_content ){ if (!is_reasoning_content){ opt.onMessage({text:"\n\n" ,isFinish: false}) } opt.onMessage({text:obj.choices[0].delta?.reasoning_content ,isFinish:obj.choices[0].finish_reason!=null }) is_reasoning_content=true }else{ if(is_reasoning_content){ opt.onMessage({text:"\n\n" ,isFinish: false}) } is_reasoning_content=false opt.onMessage({text:obj.choices[0].delta?.content??'' ,isFinish:obj.choices[0].finish_reason!=null }) } } }, onError(e ){ //console.log('eee>>', e ) mlog('❌未错误',e ) opt.onError && opt.onError(e) }, body:JSON.stringify(body) }); } catch (error ) { mlog('❌未错误2',error ) opt.onError && opt.onError(error) } }else{ try { mlog('🐞非流输出',body ) opt.onMessage({text: t('mj.thinking') ,isFinish: false }) let obj :any= await gptFetch( '/v1/chat/completions',body ) //mlog('结果 >>',obj ) opt.onMessage({text:obj.choices[0].message.content??'' ,isFinish: true ,isAll:true}) } catch (error ) { mlog('❌未错误2',error ) opt.onError && opt.onError(error) } } } export const getInitChat = (txt:string )=>{ let promptMsg: Chat.Chat= { dateTime: new Date().toLocaleString(), text: txt , inversion: true, error: false, conversationOptions: null, requestOptions: { prompt:txt, options: null }, } return promptMsg; } export interface ttsType{ model: string, input: string , voice?: string, } export const subTTS = async (tts:ttsType )=>{ if(!tts.voice) tts.voice='alloy'; let url= getUrl('/v1/audio/speech'); let headers= { 'Content-Type': 'application/json' } headers={...headers,...getHeaderAuthorization()} const response = await fetch(url, { method: 'POST', headers, body: JSON.stringify(tts), }); if (!response.ok) { throw new Error(`API request failed with status ${response.status}`); } const audioData = await response.arrayBuffer(); const contentType = response.headers.get('Content-Type') const blob = new Blob([audioData], { type: contentType??'audio/mpeg' }); mlog('blob', blob); const saveID = await localSaveAny( blob ); const pp= await bolbObj(blob ); return { blob,saveID ,...pp }; } export const bolbObj= ( blob:Blob )=>{ return new Promise<{player:HTMLAudioElement,duration:number }>((resolve, reject) => { const player = new window.Audio(); player.src = URL.createObjectURL(blob); player.addEventListener('loadedmetadata', () => { mlog('时长', player.duration); resolve({player,duration: player.duration }); }); player.addEventListener('error',(e )=>{ reject(e ) }) player.load(); }) } function formatDate(): string[] { const today = new Date() const year = today.getFullYear() const month = today.getMonth() + 1 const lastDay = new Date(year, month, 0) const formattedFirstDay = `${year}-${month.toString().padStart(2, '0')}-01` const formattedLastDay = `${year}-${month.toString().padStart(2, '0')}-${lastDay.getDate().toString().padStart(2, '0')}` return [formattedFirstDay, formattedLastDay] } // export const gptUsage=async ()=>{ // fetch(getUrl(url), opt ) // .then(d=>d.json().then(d=> resolve(d)) // .catch(e=>reject(e))) // .catch(e=>reject(e)) const [startDate, endDate] = formatDate(); const urlUsage = `/v1/dashboard/billing/usage?start_date=${startDate}&end_date=${endDate}` const usageData = await gptFetch(urlUsage); const billData = await gptFetch('/v1/dashboard/billing/subscription'); const usage = Math.round(usageData.total_usage) / 100 mlog('gpt', usage , billData ); //remaining = subscriptionData.system_hard_limit_usd - totalUsage; return {usage,remaining:Math.round( (billData.hard_limit??billData.hard_limit_usd*100) - usageData.total_usage ) / 100 ,hard_limit_usd:billData.hard_limit_usd } ; } export const openaiSetting= ( q:any,ms:MessageApiInjection )=>{ //mlog() mlog('setting', q ) if(q.settings){ mlog('q.setting', q.settings ) try { let obj = JSON.parse( q.settings ); const url = obj.url ?? undefined; const key = obj.key ?? undefined; //let setQ= { } gptServerStore.setMyData( { OPENAI_API_BASE_URL:url, MJ_SERVER:url, SUNO_SERVER:url, LUMA_SERVER:url, RUNWAY_SERVER:url, VIGGLE_SERVER:url, IDEO_SERVER:url, KLING_SERVER:url, PIKA_SERVER:url, UDIO_SERVER:url, PIXVERSE_SERVER:url, RIFF_SERVER:url, OPENAI_API_KEY:key, MJ_API_SECRET:key, SUNO_KEY:key, LUMA_KEY:key, RUNWAY_KEY:key, VIGGLE_KEY:key, IDEO_KEY:key, KLING_KEY:key, PIKA_KEY:key, UDIO_KEY:key, PIXVERSE_KEY:key, RIFF_KEY:key, } ) blurClean(); gptServerStore.setMyData( gptServerStore.myData ); ms.success("设置服务端成功!") } catch (error) { } } else if(isObject(q)){ mlog('setting2', q ) gptServerStore.setMyData( q ) //gptServerStore.setMyData( gptServerStore.myData ); blurClean(); gptServerStore.setMyData( gptServerStore.myData ); } } export const blurClean= ()=>{ mlog('blurClean'); gptServerStore.myData.OPENAI_API_BASE_URL =myTrim( myTrim(gptServerStore.myData.OPENAI_API_BASE_URL.trim(),'/'), '\\' ); gptServerStore.myData.OPENAI_API_KEY = gptServerStore.myData.OPENAI_API_KEY.trim(); gptServerStore.myData.MJ_SERVER =myTrim( myTrim( gptServerStore.myData.MJ_SERVER.trim(),'/'),'\\'); gptServerStore.myData.MJ_API_SECRET = gptServerStore.myData.MJ_API_SECRET.trim(); gptServerStore.myData.UPLOADER_URL= myTrim( myTrim( gptServerStore.myData.UPLOADER_URL.trim(),'/'),'\\'); } export const countTokens= async ( dataSources:Chat.Chat[], input:string ,uuid:number )=>{ const chatSet= new chatSetting(uuid); const myStore= chatSet.getGptConfig(); let rz={system:0,input:0 ,history:0,remain:330,modelTokens:'4k',planOuter:myStore.max_tokens } const model =myStore.model; const max= getModelMax(model ); let unit= 1024; if( model=='gpt-4-1106-preview' || model=='gpt-4-vision-preview' ) unit=1000; //gpt-4-turbo-2024-04-09 if (model.indexOf('gpt-4-turbo')>-1 ) unit=1000; rz.modelTokens= `${max}k` //cl100k_base.encode(input) const encode= await encodeAsync(); rz.input = encode(input).length; rz.system = encode(getSystemMessage() ).length; const encodeChat = await encodeChatAsync(); const msg= await getHistoryMessage( dataSources,1 ) ; rz.history= msg.length==0?0: encodeChat(msg, model.indexOf('gpt-4')>-1? 'gpt-4':'gpt-3.5-turbo').length // rz.remain = unit *max- rz.history- rz.planOuter- rz.input- rz.system; return rz ; } const getModelMax=( model:string )=>{ let max=4; model= model.toLowerCase(); if( model.indexOf('8k')>-1 ){ return 8; }else if( model.indexOf('16k')>-1 || model=='gpt-3.5-turbo-1106' || model=='gpt-3.5-turbo-0125' ){ return 16; }else if( model.indexOf('32k')>-1 ){ return 32; }else if( model.indexOf('grok')>-1 ){ return 128; }else if( model.indexOf('gpt-4.5')>-1|| model.indexOf('gpt-4-turbo')>-1|| model.indexOf('gpt-4o')>-1 || model.indexOf('o1-')>-1){ return 128; }else if( model.indexOf('64k')>-1 || model.indexOf('deepseek')>-1 ){ return 64; }else if( model.indexOf('128k')>-1 || model=='gpt-4-1106-preview' || model=='gpt-4-0125-preview' || model=='gpt-4-vision-preview' ){ return 128; }else if( model.indexOf('gpt-4')>-1 ){ max=8; }else if( model.toLowerCase().includes('claude-3') ){ //options.maxModelTokens = 120*1024; //options.maxResponseTokens = 4096 return 120; } return max; } export const encodeAsync = async ( ) => { const { encode } = await import('gpt-tokenizer'); return encode;//(str).length; }; export const encodeChatAsync = async ( ) => { const { encodeChat } = await import('gpt-tokenizer'); return encodeChat;//(obj,model ).length; }; export const getHistoryMessage= async (dataSources:Chat.Chat[],loadingCnt=1 ,start=1000)=>{ let i=0; let rz: ChatMessage[] = []; //const loadingCnt= 1;// 1就是没有loading,3 就是有loading let istart = (isNumber( start)&& start>=0 )? Math.min(start , dataSources.length - loadingCnt ): dataSources.length- loadingCnt ; mlog('istart',istart, start); for( let ii= istart ; ii>=0 ; ii-- ){ //let o of dataSources.value if(i>=gptConfigStore.myData.talkCount) break; i++; let o = dataSources[ii]; //mlog('o',ii ,o); let content= o.text; if( o.inversion && o.opt?.images && o.opt.images.length>0 ){ //获取附件信息 比如 图片 文件等 try{ let str = await localGet( o.opt.images[0]) as string; let fileBase64= JSON.parse(str) as string[]; let arr = fileBase64.filter( (ff:string)=>ff.indexOf('http')>-1); if(arr.length>0) content = arr.join(' ')+' '+ content ; mlog(t('mjchat.attr') ,o.opt.images[0] , content ); }catch(ee){ } } //mlog('d',gptConfigStore.myData.talkCount ,i ,o.inversion , o.text); rz.push({content , role: !o.inversion ? 'assistant' : 'user'}); } rz.reverse(); mlog('rz',rz); return rz ; } export const isDisableMenu=(menu:string)=>{ return (homeStore.myData.session && homeStore.myData.session.menuDisable && homeStore.myData.session.menuDisable.indexOf( menu)>-1 ) } ================================================ FILE: src/api/pika.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sleep } from "./suno"; import { RunwayTask, runwayStore } from "./runwayStore"; import { PikaTask, pikaStore } from "./pikaStore"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.RUNWAY_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.PIKA_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= url.indexOf('/pro')>-1?'/pro':'';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.PIKA_SERVER ){ if(gptServerStore.myData.PIKA_SERVER.indexOf('/pro')>0){ return `${ gptServerStore.myData.PIKA_SERVER}/pika${url}`; } return `${ gptServerStore.myData.PIKA_SERVER}${pro_prefix}/pika${url}`; } return `${pro_prefix}/pika${url}`; } export const pikaFetch=(url:string,data?:any,opt2?:any )=>{ mlog('pikaFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const pikaFeed= async(id:string)=>{ const sunoS = new pikaStore(); for(let i=0; i<200;i++){ try{ let a= await pikaFetch('/feed/' +id ) let task= a as PikaTask; mlog("task",a ) if(!task.videos || task.videos.length==0) continue; task.last_feed=new Date().getTime() sunoS.save( task ) homeStore.setMyData({act:'PikaFeed'}); if( task.videos[0].status=='error' || 'finished'== task.videos[0].status ){ break; } }catch(e){ } await sleep(5200) } } ================================================ FILE: src/api/pikaStore.ts ================================================ import { ss } from "@/utils/storage"; interface Video { id: string; status: string; seed: number; resultUrl: string; sharingUrl: string; videoPoster: string; imageThumb: string; duration: number; error: string; progress: number; } // 定义主结构体接口 export interface PikaTask { id: string; promptText: string; videos: Video[]; last_feed?:number; } export class pikaStore{ //private id: string; private localKey='pika-store'; public save(obj:PikaTask ){ if(!obj.id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():PikaTask[]{ const obj = ss.get( this.localKey ) as undefined| PikaTask[]; if(!obj) return []; return obj; } public getOneById(id:string):PikaTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( obj:PikaTask ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/pixverse.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { pixverseRep, pixverseStore, pixverseTask } from "./pixverseStore"; import { sleep } from "./suno"; // import { KlingTask, klingStore } from "./klingStore"; // import { sleep } from "./suno"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.KLING_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.PIXVERSE_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= '';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.PIXVERSE_SERVER ){ return `${ gptServerStore.myData.PIXVERSE_SERVER}${pro_prefix}/pixverse${url}`; } return `${pro_prefix}/pixverse${url}`; } export const pixFetch=(url:string,data?:any,opt2?:any )=>{ mlog('runwayFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const pixFeed= async( id:number)=>{ const sunoS = new pixverseStore(); let url= `/feed/${id}`; for(let i=0; i<200;i++){ try{ let a= await pixFetch( url ) //let task= a as KlingTask; if(a.ErrCode==0 && a.Resp){ //task.last_feed=new Date().getTime() let d= a.Resp as pixverseRep const task:pixverseTask={ video_id:id,last_feed:new Date().getTime(), data:d } sunoS.save( task ) homeStore.setMyData({act:'PixFeed'}); mlog('pixFetch', a ) if (d.video_status==1){ break; } } }catch(e){ } await sleep(5200) } } ================================================ FILE: src/api/pixverseStore.ts ================================================ import { ss } from "@/utils/storage"; export interface pixverseRep{ video_status: number; created_at: string; first_frame: string; prompt: string; model: string; negative_prompt: string; quality: string; motion_mode: string; video_duration: number; last_frame: string; extended?: number; url: string; } export interface pixverseTask { video_id: number; last_feed?: number //最后更新时间 data?:pixverseRep } export class pixverseStore{ //private id: string; private localKey='pixverse-store'; public save(obj:pixverseTask ){ if(!obj.video_id) throw "video_id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.video_id==obj.video_id); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:number){ return this.getObjs().findIndex( v=>v.video_id == id ) } public getObjs():pixverseTask[]{ const obj = ss.get( this.localKey ) as undefined| pixverseTask[]; if(!obj) return []; return obj; } public getOneById(id:number):pixverseTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( id:number ){ //if(!obj.data.task_id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.video_id==id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/realtime.ts ================================================ export const instructions = `System settings: Tool use: enabled. Instructions: - You are an artificial intelligence agent responsible for helping test realtime voice capabilities - Please make sure to respond with a helpful voice via audio - Be kind, helpful, and curteous - It is okay to ask the user questions - Use tools and functions you have available liberally, it is part of the training apparatus - Be open to exploration and conversation - Remember: this is just for fun and testing! Personality: - Be upbeat and genuine - Try speaking quickly as if excited `; export interface RealtimeEvent { time: string; source: 'client' | 'server'; count?: number; event: { [key: string]: any }; } ================================================ FILE: src/api/riff.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { pixverseRep, pixverseStore, pixverseTask } from "./pixverseStore"; import { sleep } from "./suno"; import { riffAudio, riffStore, riffTask } from "./riffStore"; // import { KlingTask, klingStore } from "./klingStore"; // import { sleep } from "./suno"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.RIFF_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.RIFF_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= '';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.RIFF_SERVER ){ return `${ gptServerStore.myData.RIFF_SERVER}${pro_prefix}/riffusion${url}`; } return `${pro_prefix}/riffusion${url}`; } export const riffFetch=(url:string,data?:any,opt2?:any )=>{ mlog('riffFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const riffFeed= async( ids:string)=>{ const sunoS = new riffStore(); let url= `/feed/${ids}`; for(let i=0; i<200;i++){ try{ let a= await riffFetch( url ) mlog('riffFetch', a ) if(a.generations && a.generations.length >0){ for(let o of a.generations){ mlog('riffFetch-one', o ) let d:riffAudio= o as riffAudio const task:riffTask={ id:d.id,last_feed:new Date().getTime(),riff:d,status: a.status } sunoS.save( task ) } if(a.status=='success'){ homeStore.setMyData({act:'RiffFeed'}); break; } }else{ let arr= ids.split(',') for(let id of arr){ const task:riffTask={ id,last_feed:new Date().getTime(), status: 'submitted' } sunoS.save( task ) } } homeStore.setMyData({act:'RiffFeed'}); }catch(e){ } await sleep(5200) } } ================================================ FILE: src/api/riffStore.ts ================================================ import { ss } from "@/utils/storage"; export interface riffAudio { audio_url?: string; duration_s: number; id: string; image_url?: string; lyrics?: string; model_display_name: string; sound?: string; title?: string; topic?: string; } export interface riffTask { id:string status:string riff?:riffAudio last_feed?: number //最后更新时间 } export class riffStore{ //private id: string; private localKey='riff-store'; public save(obj:riffTask ){ if(!obj.id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id == id ) } public getObjs():riffTask[]{ const obj = ss.get( this.localKey ) as undefined| riffTask[]; if(!obj) return []; return obj; } public getOneById(id:string):riffTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( id:string ){ let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==id ); //mlog('ddd',i , arr) if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/runway.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sleep } from "./suno"; import { RunwayTask, runwayStore } from "./runwayStore"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.RUNWAY_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.RUNWAY_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= url.indexOf('/pro')>-1?'/pro':'';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.RUNWAY_SERVER ){ if(gptServerStore.myData.RUNWAY_SERVER.indexOf('/pro')>0){ return `${ gptServerStore.myData.RUNWAY_SERVER}/runway${url}`; } return `${ gptServerStore.myData.RUNWAY_SERVER}${pro_prefix}/runway${url}`; } return `${pro_prefix}/runway${url}`; } export const runwayFetch=(url:string,data?:any,opt2?:any )=>{ mlog('runwayFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const runwayFeed= async(id:string)=>{ const sunoS = new runwayStore(); for(let i=0; i<200;i++){ try{ let a= await runwayFetch('/tasks/' +id ) let task= a.task as RunwayTask; task.last_feed=new Date().getTime() //ss.save( task ) mlog("a",a.task ) sunoS.save( task ) homeStore.setMyData({act:'RunwayFeed'}); if( a.task.status=='FAILED' || 'SUCCEEDED'== a.task.status ){ break; } }catch(e){ } await sleep(5200) } } export const runwayUpload= async (file:any , type :string)=>{ let obj={ "filename": file.name, "numberOfParts": 1, type //"DATASET_PREVIEW" } const d:any = await runwayFetch('/uploads',obj) mlog("runwayUpload",d) const response= await fetch( d.uploadUrls[0], { method: 'PUT', body: file, headers: { 'Content-Type': d.uploadHeaders["Content-Type"], 'Accept': '/', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive' } }) ; //const djson:any = await response.json(); if (response.status!=200){ throw "upload file faile" } //mlog("runwayUpload2", djson) // return djson uploads/0e01608a-89f8-4cb8-920a-669813fb224f/complete let obj2={"parts":[{"PartNumber":1,"ETag":"ca3b00c313b6fd9a5c48889ad16f7d5e"}]} const d2:any = await runwayFetch(`/uploads/${d.id}/complete`, obj2 ) mlog("runwayUpload2", d2) return d2; } ================================================ FILE: src/api/runwayStore.ts ================================================ import { ss } from "@/utils/storage"; interface Options { name: string; seconds: number; gen2Options?: Gen2Options; exploreMode?: boolean; assetGroupName?: string; recordingEnabled?: boolean; text_prompt?:string } interface Gen2Options { mode: string; seed: number; interpolate: boolean; upscale: boolean; watermark: boolean; motion_score: number; use_motion_score: boolean; use_motion_vectors: boolean; text_prompt: string; image_prompt?: string; init_image?: string; } interface Artifact { id: string; createdAt: string; updatedAt: string; userId: number; createdBy: number; taskId: string; parentAssetGroupId: string; filename: string; url: string; fileSize: string; isDirectory: boolean; previewUrls: string[]; private: boolean; privateInTeam: boolean; deleted: boolean; reported: boolean; metadata: Metadata; favorite: boolean; } interface Metadata { frameRate: number; duration: number; dimensions: number[]; size: Size; } interface Size { width: number; height: number; } export interface RunwayTask { id: string; name: string; image: any; // Can be changed to a specific type if needed createdAt: string; updatedAt: string; taskType: string; options: Options; status: string; error: any; // Can be changed to a specific type if needed progressText: any; // Can be changed to a specific type if needed progressRatio: string; estimatedTimeToStartSeconds?: number; // Can be changed to a specific type if needed artifacts?: Artifact[]; sharedAsset: any; // Can be changed to a specific type if needed last_feed?:number; } export class runwayStore{ //private id: string; private localKey='runway-store'; public save(obj:RunwayTask ){ if(!obj.id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():RunwayTask[]{ const obj = ss.get( this.localKey ) as undefined| RunwayTask[]; if(!obj) return []; return obj; } public getOneById(id:string):RunwayTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( obj:RunwayTask ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/runwayml.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sleep } from "./suno"; import { RunwayMlStore, RunwayMlTask } from "./runwaymlStore"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.RUNWAY_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.RUNWAY_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= url.indexOf('/pro')>-1?'/pro':'';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.RUNWAY_SERVER ){ return `${ gptServerStore.myData.RUNWAY_SERVER}${pro_prefix}/runwayml${url}`; } return `${pro_prefix}/runwayml${url}`; } export const runwayMlFetch=(url:string,data?:any,opt2?:any )=>{ mlog('runwayFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; const otherHeader ={ 'X-Runway-Version': '2024-11-06'} headers={...headers,...getHeaderAuthorization()} //,...otherHeader return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export interface RunwayMlInput { model:string promptText:string } export const runwayMlFeed= async(id:string, input:RunwayMlInput)=>{ const sunoS = new RunwayMlStore(); for(let i=0; i<1200; i++){ let d= await runwayMlFetch(`/v1/tasks/${id}`) let task:RunwayMlTask={...d,...input} as RunwayMlTask task.last_feed=new Date().getTime() sunoS.save( task ) homeStore.setMyData({act:'runwayml.feed'}) if(task.status=='SUCCEEDED' || 'FAILED'== task.status ){ break; } //mlog('ddd>>',d ) await sleep(5800) } } export const runwayMlFeedById= async(id:string)=>{ const sunoS = new RunwayMlStore(); const obj= sunoS.getOneById(id) if (!obj) return ; runwayMlFeed(id,{ model:obj.model,promptText:obj.promptText}) } export function getRandomInt(min: number, max: number): number { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } ================================================ FILE: src/api/runwaymlStore.ts ================================================ import { ss } from "@/utils/storage"; export interface RunwayMlTask { id: string; status: string; createdAt: string; output?: string[]; last_feed?:number; failure?: string failureCode?: string model:string promptText:string } export class RunwayMlStore{ //private id: string; private localKey='runwayml-store'; public save(obj:RunwayMlTask ){ if(!obj.id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():RunwayMlTask[]{ const obj = ss.get( this.localKey ) as undefined| RunwayMlTask[]; if(!obj) return []; return obj; } public getOneById(id:string):RunwayMlTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( obj:RunwayMlTask ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/sse/fetch.ts ================================================ /// const fetch = globalThis.fetch export { fetch } ================================================ FILE: src/api/sse/fetchsse.ts ================================================ import { createParser } from 'eventsource-parser' import * as types from './types' import { fetch as globalFetch } from './fetch' import { streamAsyncIterable } from './stream-async-iterable' export class ChatGPTError2 extends types.ChatGPTError{ reason?:string } export async function fetchSSE( url: string, options: Parameters[1] & { onMessage: (data: string) => void onError?: (error: any) => void }, fetch: types.FetchFn = globalFetch ) { const { onMessage, onError, ...fetchOptions } = options let res ; try{ res = await fetch(url, fetchOptions) }catch(e :any ){ throw {reason: JSON.stringify({message:'fetch error, pleace check url',url ,code:'fetch_error'}) } } if (!res.ok) { let reason: string try { reason = await res.text() } catch (err) { reason = res.statusText } const msg = `ChatGPT error ${res.status}: ${reason}` const error = new ChatGPTError2(msg, { cause: res }) error.statusCode = res.status error.statusText = res.statusText error.reason =reason throw error } const parser = createParser((event) => { if (event.type === 'event') { onMessage(event.data) } }) // handle special response errors const feed = (chunk: string) => { let response = null try { response = JSON.parse(chunk) } catch { // ignore } if (response?.detail?.type === 'invalid_request_error') { const msg = `ChatGPT error ${response.detail.message}: ${response.detail.code} (${response.detail.type})` const error = new types.ChatGPTError(msg, { cause: response }) error.statusCode = response.detail.code error.statusText = response.detail.message if (onError) { onError(error) } else { console.error(error) } // don't feed to the event parser return } parser.feed(chunk) } if (!res.body.getReader) { // Vercel polyfills `fetch` with `node-fetch`, which doesn't conform to // web standards, so this is a workaround... const body: NodeJS.ReadableStream = res.body as any if (!body.on || !body.read) { throw new types.ChatGPTError('unsupported "fetch" implementation') } body.on('readable', () => { let chunk: string | Buffer while (null !== (chunk = body.read())) { feed(chunk.toString()) } }) } else { for await (const chunk of streamAsyncIterable(res.body)) { const str = new TextDecoder().decode(chunk) //console.log(str ); feed(str) } } } ================================================ FILE: src/api/sse/stream-async-iterable.ts ================================================ export async function* streamAsyncIterable(stream: ReadableStream) { const reader = stream.getReader() try { while (true) { const { done, value } = await reader.read() if (done) { return } yield value } } finally { reader.releaseLock() } } ================================================ FILE: src/api/sse/types.ts ================================================ //import Keyv from 'keyv' export type Role = 'user' | 'assistant' | 'system' export type FetchFn = typeof fetch export type ChatGPTAPIOptions = { apiKey: string /** @defaultValue `'https://api.openai.com'` **/ apiBaseUrl?: string apiOrg?: string /** @defaultValue `false` **/ debug?: boolean completionParams?: Partial< Omit > systemMessage?: string /** @defaultValue `4096` **/ maxModelTokens?: number /** @defaultValue `1000` **/ maxResponseTokens?: number //messageStore?: Keyv getMessageById?: GetMessageByIdFunction upsertMessage?: UpsertMessageFunction fetch?: FetchFn } export type SendMessageOptions = { /** The name of a user in a multi-user chat. */ name?: string parentMessageId?: string conversationId?: string messageId?: string stream?: boolean systemMessage?: string timeoutMs?: number onProgress?: (partialResponse: ChatMessage) => void abortSignal?: AbortSignal completionParams?: Partial< Omit > } export type MessageActionType = 'next' | 'variant' export type SendMessageBrowserOptions = { conversationId?: string parentMessageId?: string messageId?: string action?: MessageActionType timeoutMs?: number onProgress?: (partialResponse: ChatMessage) => void abortSignal?: AbortSignal } export interface ChatMessage { id: string text: string role: Role name?: string delta?: string detail?: | openai.CreateChatCompletionResponse | CreateChatCompletionStreamResponse // relevant for both ChatGPTAPI and ChatGPTUnofficialProxyAPI parentMessageId?: string // only relevant for ChatGPTUnofficialProxyAPI (optional for ChatGPTAPI) conversationId?: string } export class ChatGPTError extends Error { statusCode?: number statusText?: string isFinal?: boolean accountId?: string } /** Returns a chat message from a store by it's ID (or null if not found). */ export type GetMessageByIdFunction = (id: string) => Promise /** Upserts a chat message to a store. */ export type UpsertMessageFunction = (message: ChatMessage) => Promise export interface CreateChatCompletionStreamResponse extends openai.CreateChatCompletionDeltaResponse { usage: CreateCompletionStreamResponseUsage } export interface CreateCompletionStreamResponseUsage extends openai.CreateCompletionResponseUsage { estimated: true } /** * https://chat.openapi.com/backend-api/conversation */ export type ConversationJSONBody = { /** * The action to take */ action: string /** * The ID of the conversation */ conversation_id?: string /** * Prompts to provide */ messages: Prompt[] /** * The model to use */ model: string /** * The parent message ID */ parent_message_id: string } export type Prompt = { /** * The content of the prompt */ content: PromptContent /** * The ID of the prompt */ id: string /** * The role played in the prompt */ role: Role } export type ContentType = 'text' export type PromptContent = { /** * The content type of the prompt */ content_type: ContentType /** * The parts to the prompt */ parts: string[] } export type ConversationResponseEvent = { message?: Message conversation_id?: string error?: string | null } export type Message = { id: string content: MessageContent role: Role user: string | null create_time: string | null update_time: string | null end_turn: null weight: number recipient: string metadata: MessageMetadata } export type MessageContent = { content_type: string parts: string[] } export type MessageMetadata = any export namespace openai { export interface CreateChatCompletionDeltaResponse { id: string object: 'chat.completion.chunk' created: number model: string choices: [ { delta: { role: Role content?: string } index: number finish_reason: string | null } ] } /** * * @export * @interface ChatCompletionRequestMessage */ export interface ChatCompletionRequestMessage { /** * The role of the author of this message. * @type {string} * @memberof ChatCompletionRequestMessage */ role: ChatCompletionRequestMessageRoleEnum /** * The contents of the message * @type {string} * @memberof ChatCompletionRequestMessage */ content: string /** * The name of the user in a multi-user chat * @type {string} * @memberof ChatCompletionRequestMessage */ name?: string } export declare const ChatCompletionRequestMessageRoleEnum: { readonly System: 'system' readonly User: 'user' readonly Assistant: 'assistant' } export declare type ChatCompletionRequestMessageRoleEnum = (typeof ChatCompletionRequestMessageRoleEnum)[keyof typeof ChatCompletionRequestMessageRoleEnum] /** * * @export * @interface ChatCompletionResponseMessage */ export interface ChatCompletionResponseMessage { /** * The role of the author of this message. * @type {string} * @memberof ChatCompletionResponseMessage */ role: ChatCompletionResponseMessageRoleEnum /** * The contents of the message * @type {string} * @memberof ChatCompletionResponseMessage */ content: string } export declare const ChatCompletionResponseMessageRoleEnum: { readonly System: 'system' readonly User: 'user' readonly Assistant: 'assistant' } export declare type ChatCompletionResponseMessageRoleEnum = (typeof ChatCompletionResponseMessageRoleEnum)[keyof typeof ChatCompletionResponseMessageRoleEnum] /** * * @export * @interface CreateChatCompletionRequest */ export interface CreateChatCompletionRequest { /** * ID of the model to use. Currently, only `gpt-3.5-turbo` and `gpt-3.5-turbo-0301` are supported. * @type {string} * @memberof CreateChatCompletionRequest */ model: string /** * The messages to generate chat completions for, in the [chat format](/docs/guides/chat/introduction). * @type {Array} * @memberof CreateChatCompletionRequest */ messages: Array /** * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or `top_p` but not both. * @type {number} * @memberof CreateChatCompletionRequest */ temperature?: number | null /** * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or `temperature` but not both. * @type {number} * @memberof CreateChatCompletionRequest */ top_p?: number | null /** * How many chat completion choices to generate for each input message. * @type {number} * @memberof CreateChatCompletionRequest */ n?: number | null /** * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. * @type {boolean} * @memberof CreateChatCompletionRequest */ stream?: boolean | null /** * * @type {CreateChatCompletionRequestStop} * @memberof CreateChatCompletionRequest */ stop?: CreateChatCompletionRequestStop /** * The maximum number of tokens allowed for the generated answer. By default, the number of tokens the model can return will be (4096 - prompt tokens). * @type {number} * @memberof CreateChatCompletionRequest */ max_tokens?: number /** * Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model\'s likelihood to talk about new topics. [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details) * @type {number} * @memberof CreateChatCompletionRequest */ presence_penalty?: number | null /** * Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model\'s likelihood to repeat the same line verbatim. [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details) * @type {number} * @memberof CreateChatCompletionRequest */ frequency_penalty?: number | null /** * Modify the likelihood of specified tokens appearing in the completion. Accepts a json object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. * @type {object} * @memberof CreateChatCompletionRequest */ logit_bias?: object | null /** * A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids). * @type {string} * @memberof CreateChatCompletionRequest */ user?: string } /** * @type CreateChatCompletionRequestStop * Up to 4 sequences where the API will stop generating further tokens. * @export */ export declare type CreateChatCompletionRequestStop = Array | string /** * * @export * @interface CreateChatCompletionResponse */ export interface CreateChatCompletionResponse { /** * * @type {string} * @memberof CreateChatCompletionResponse */ id: string /** * * @type {string} * @memberof CreateChatCompletionResponse */ object: string /** * * @type {number} * @memberof CreateChatCompletionResponse */ created: number /** * * @type {string} * @memberof CreateChatCompletionResponse */ model: string /** * * @type {Array} * @memberof CreateChatCompletionResponse */ choices: Array /** * * @type {CreateCompletionResponseUsage} * @memberof CreateChatCompletionResponse */ usage?: CreateCompletionResponseUsage } /** * * @export * @interface CreateChatCompletionResponseChoicesInner */ export interface CreateChatCompletionResponseChoicesInner { /** * * @type {number} * @memberof CreateChatCompletionResponseChoicesInner */ index?: number /** * * @type {ChatCompletionResponseMessage} * @memberof CreateChatCompletionResponseChoicesInner */ message?: ChatCompletionResponseMessage /** * * @type {string} * @memberof CreateChatCompletionResponseChoicesInner */ finish_reason?: string } /** * * @export * @interface CreateCompletionResponseUsage */ export interface CreateCompletionResponseUsage { /** * * @type {number} * @memberof CreateCompletionResponseUsage */ prompt_tokens: number /** * * @type {number} * @memberof CreateCompletionResponseUsage */ completion_tokens: number /** * * @type {number} * @memberof CreateCompletionResponseUsage */ total_tokens: number } } ================================================ FILE: src/api/suno.ts ================================================ import { gptServerStore,homeStore,useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sunoStore,SunoMedia } from "./sunoStore"; const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; if(gptServerStore.myData.SUNO_SERVER){ if( gptServerStore.myData.SUNO_SERVER.indexOf('suno')>0 ) return `${ gptServerStore.myData.SUNO_SERVER}${url}`; return `${ gptServerStore.myData.SUNO_SERVER}/suno${url}`; } return `/sunoapi${url}`; } function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.SUNO_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.SUNO_KEY } headers= {...headers, ...bmi } return headers } export function sleep(time: number) { return new Promise((resolve) => setTimeout(resolve, time)); } export const lyricsFetch= async ( lid:string)=>{ for(let i=0;i<50;i++){ let dt:any = await sunoFetch(`/lyrics/${lid}`); mlog("ddd",dt ) let time= (i+1) if(time>20) time=20; if(dt.status=='complete') return dt ; if( dt.status=='error') return null; await sleep( time*1000 ) } return null; } export function randStyle(): string { const s: string[] = ["acoustic", "aggressive", "anthemic", "atmospheric", "bouncy", "chill", "dark", "dreamy", "electronic", "emotional", "epic", "experimental", "futuristic", "groovy", "heartfelt", "infectious", "melodic", "mellow", "powerful", "psychedelic", "romantic", "smooth", "syncopated", "uplifting", ""]; const l: string[] = ["afrobeat", "anime", "ballad", "bedroom pop", "bluegrass", "blues", "classical", "country", "cumbia", "dance", "dancepop", "delta blues", "electropop", "disco", "dream pop", "drum and bass", "edm", "emo", "folk", "funk", "future bass", "gospel", "grunge", "grime", "hip hop", "house", "indie", "j-pop", "jazz", "k-pop", "kids music", "metal", "new jack swing", "new wave", "opera", "pop", "punk", "raga", "rap", "reggae", "reggaeton", "rock", "rumba", "salsa", "samba", "sertanejo", "soul", "synthpop", "swing", "synthwave", "techno", "trap", "uk garage"]; const randomS: string = s[Math.floor(Math.random() * s.length)]; const randomL: string = l[Math.floor(Math.random() * l.length)]; // const randomS2: string = s[Math.floor(Math.random() * s.length)]; // const randomL2: string = l[Math.floor(Math.random() * l.length)]; return randomS + " " + randomL ; } export const FeedTask= async (ids:string[])=>{ const sunoS = new sunoStore(); if(ids.length<=0) return; let d:any[] = await sunoFetch('/feed/'+ ids.join(',')); mlog('FeedTask',d ) d.forEach( (item:SunoMedia) =>{ sunoS.save( item) if(item.status== "complete" || item.status== "error" ){ ids= ids.filter(v=>v!=item.id ) } }); homeStore.setMyData({act:'FeedTask'}); await sleep(5*1020 ); FeedTask(ids) } export const sunoFetch=(url:string,data?:any,opt2?:any )=>{ mlog('sunoFetch', url ); let headers= {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } ================================================ FILE: src/api/sunoStore.ts ================================================ import { ss } from '@/utils/storage' export type SunoMedia = { id: string; video_url: string; audio_url: string; image_url: string; image_large_url: string; is_video_pending: boolean; major_model_version: string; model_name: string; metadata: { tags?: string; prompt: string; gpt_description_prompt?: string ; audio_prompt_id?: string ; history?: string ; concat_history?: string ; type: string; duration: number; refund_credits: boolean; stream: boolean; error_type?: string ; error_message?: string ; }; is_liked: boolean; user_id: string; display_name: string; handle: string; is_handle_updated: boolean; is_trashed: boolean; reaction?: any; // You might want to define a proper type for this created_at: string; status: string; title: string; play_count: number; upvote_count: number; is_public: boolean; }; export class sunoStore{ //private id: string; private localKey='suno-store'; public save(obj:SunoMedia ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id== id ) } public getObjs():SunoMedia[]{ const obj = ss.get( this.localKey ) as undefined| SunoMedia[]; if(!obj) return []; return obj; } public delete( obj:SunoMedia ){ if(!obj.id ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/udio.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; //import { KlingTask, klingStore } from "./klingStore"; import { sleep } from "./suno"; import { udioStore, udioTask } from "./udioStore"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.UDIO_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.UDIO_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= ''; url= url.replaceAll('/pro','') if(gptServerStore.myData.UDIO_SERVER ){ return `${ gptServerStore.myData.UDIO_SERVER}${pro_prefix}${url}`; } return `${pro_prefix}${url}`; } export const udioFetch=(url:string,data?:any,opt2?:any )=>{ mlog('udioFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export const udioFeedTask= async(id:string)=>{ mlog('god >>',id ) const sunoS = new udioStore(); for(let i=0;i<50;i++ ){ let d= await udioFetch('/udio/fetch/'+id ) // .then(d=>{ // mlog('fetch',d , d.data.status ) // if(d.data && d.data.status=='SUCCESS'){ // return // } // }).catch((e)=>mlog('error ',e )) if(d.data ){ //mlog('ddd> ' , d.data.data ); if( d.data.data && d.data.data.songs){ for(let ab of d.data.data.songs ){ let song= ab as udioTask song.status= d.data.status song.taskId= d.data.task_id song.failReason= d.data.fail_reason song.last_feed=new Date().getTime() sunoS.save( song) //mlog('d', song ) homeStore.setMyData({act:'udio.feed'}); } } if(d.data.status=='SUCCESS' ) return } await sleep(5000) } } ================================================ FILE: src/api/udioStore.ts ================================================ import { ss } from "@/utils/storage"; import { mlog } from "./mjapi"; export interface udioTask { // id: string; // generationId: string; // tags?: string[]; // title: string; // artist: string; // lyrics?: string; // //prompt: string; // //disliked: boolean; // duration: number; // finished: boolean; // songPath: string; // //userTags: string[]; // createdAt: string; // // errorCode: string | null; // // errorType: string | null; // imagePath: string; // //videoPath: string | null; // // attribution: string; // // description: string; // //publishable: boolean; // errorDetail?: string; // artistImage: string; id: string; tags?: string[]; title: string; //artist: string; lyrics: string; prompt: string; //disliked: boolean; duration: number; finished: boolean; song_path: string; //user_tags: string[]; created_at: string; // ISO 8601 format // error_code: string | null; // error_type: string | null; image_path: string; // video_path?: string ; attribution: string; description: string; publishable: boolean; artist_image: string; error_detail?: string ; generation_id: string; audio_conditioning_type?:string last_feed?: number //最后更新时间 status?:string taskId?:string failReason?:string } export class udioStore{ //private id: string; private localKey='udio-store'; public save(obj:udioTask ){ if(!obj.id ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==obj.id ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.id == id ) } public getObjs():udioTask[]{ const obj = ss.get( this.localKey ) as undefined| udioTask[]; if(!obj) return []; return obj; } public getOneById(id:string):udioTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( id:string ){ let arr= this.getObjs(); let i= arr.findIndex( v=>v.id==id ); //mlog('ddd',i , arr) if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/api/units.ts ================================================ import { homeStore } from "@/store" export const checkDisableGpt4=( model:string )=>{ if(!homeStore.myData.session.disableGpt4 || homeStore.myData.session.disableGpt4!='1') return false; const rz = model.indexOf('gpt-4')>-1 ; if(rz){ homeStore.setMyData({isLoader:false,act:'stopLoading'}); } return rz ; } export const isApikeyError=( text:string )=>{ text= text.toLocaleLowerCase(); if( text.indexOf('error') && ( text.indexOf('无效的令牌')>-1 //one-api 错误 || text.indexOf('incorrect api key')>-1 //原生 || text.indexOf('key error')>-1 )) return true ; return false; } export const isAuthSessionError = ( text:string )=>{ text= text.toLocaleLowerCase(); if(text.indexOf('token_check')>-1 ) return true ; return false; } ================================================ FILE: src/api/viggle.ts ================================================ import { gptServerStore, homeStore, useAuthStore } from "@/store"; import { mlog } from "./mjapi"; import { sleep } from "./suno"; import { ViggleTask, viggleStore } from "./viggleStore"; import { lumaHkStore } from "./lumaStore"; function getHeaderAuthorization(){ let headers={} if( homeStore.myData.vtoken ){ const vtokenh={ 'x-vtoken': homeStore.myData.vtoken ,'x-ctoken': homeStore.myData.ctoken}; headers= {...headers, ...vtokenh} } if(!gptServerStore.myData.VIGGLE_KEY){ const authStore = useAuthStore() if( authStore.token ) { const bmi= { 'x-ptoken': authStore.token }; headers= {...headers, ...bmi } return headers; } return headers } const bmi={ 'Authorization': 'Bearer ' +gptServerStore.myData.VIGGLE_KEY } headers= {...headers, ...bmi } return headers } export const getUrl=(url:string)=>{ if(url.indexOf('http')==0) return url; const pro_prefix= url.indexOf('/pro')>-1?'/pro':'';//homeStore.myData.is_luma_pro?'/pro':'' url= url.replaceAll('/pro','') if(gptServerStore.myData.VIGGLE_SERVER){ if(gptServerStore.myData.VIGGLE_SERVER.indexOf('/pro')>0){ return `${ gptServerStore.myData.VIGGLE_SERVER}/viggle${url}`; } return `${ gptServerStore.myData.VIGGLE_SERVER}${pro_prefix}/viggle${url}`; } return `${pro_prefix}/viggle${url}`; } export interface tagInfo { id: string; name: string; sort: number; } export interface ViggleTemplate { id: string; processedURL: string; processedHdURL: string; processedCoverURL: string; command?: string; webCommand?: string; description: string; webStatus?: number; dcStatus?: number; appStatus?: number; bgURL?: string; bgCoverURL?: string; displayURL?: string; displayHdURL?: string; displayCoverURL?: string; gifURL?: string; webPURL?: string; source?: string; sort?: number; width?: number; height?: number; } export const viggleFetch=(url:string,data?:any,opt2?:any )=>{ mlog('viggleFetch', url ); let headers= opt2?.upFile?{}: {'Content-Type':'application/json'} if(opt2 && opt2.headers ) headers= opt2.headers; headers={...headers,...getHeaderAuthorization()} return new Promise((resolve, reject) => { let opt:RequestInit ={method:'GET'}; opt.headers= headers ; if(opt2?.upFile ){ opt.method='POST'; opt.body=data as FormData ; } else if(data) { opt.body= JSON.stringify(data) ; opt.method='POST'; } fetch(getUrl(url), opt ) .then( async (d) =>{ if (!d.ok) { let msg = '发生错误: '+ d.status try{ let bjson:any = await d.json(); msg = '('+ d.status+')发生错误: '+(bjson?.error?.message??'' ) }catch( e ){ } homeStore.myData.ms && homeStore.myData.ms.error(msg ) throw new Error( msg ); } d.json().then(d=> resolve(d)).catch(e=>{ homeStore.myData.ms && homeStore.myData.ms.error('发生错误'+ e ) reject(e) } )}) .catch(e=>{ if (e.name === 'TypeError' && e.message === 'Failed to fetch') { homeStore.myData.ms && homeStore.myData.ms.error('跨域|CORS error' ) } else homeStore.myData.ms && homeStore.myData.ms.error('发生错误:'+e ) mlog('e', e.stat ) reject(e) }) }) } export async function FeedViggleTask(id:string){ const ss = new viggleStore() const hk= new lumaHkStore(); const hkObj= hk.getOneById(id) for(let i=0; i<500;i++){ let url= '/video-task/by-ids'; if(hkObj && hkObj.isHK ) url= '/pro/video-task/by-ids'; const d= await viggleFetch(url,{ids:[id]}) mlog('FeedViggleTask', d ) if(d.data && d.data.length>0){ let task= d.data[0] as ViggleTask; task.last_feed=new Date().getTime() ss.save( task ) homeStore.setMyData({act:'FeedViggleTask'}) if ( d.data[0].status==0) return } await sleep(2000) } } ================================================ FILE: src/api/viggleStore.ts ================================================ import { ss } from "@/utils/storage"; export interface ViggleTask { taskID: string; name: string; status: number; videoDuration: number; bgMode: number; modelInfoID: number; optimize: boolean; watermark: number; freeCredits: number; planCredits: number; purchasedCredits: number; mqType: number; result: string; resultCover: string; createdAt: string; last_feed:number; } export class viggleStore{ //private id: string; private localKey='viggle-store'; public save(obj:ViggleTask ){ if(!obj.taskID ) throw "taskID must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.taskID==obj.taskID ); if(i>-1) arr[i]= obj; else arr.push(obj); ss.set(this.localKey, arr ); return this; } public findIndex(id:string){ return this.getObjs().findIndex( v=>v.taskID== id ) } public getObjs():ViggleTask[]{ const obj = ss.get( this.localKey ) as undefined| ViggleTask[]; if(!obj) return []; return obj; } public getOneById(id:string):ViggleTask|null{ const i= this.findIndex(id) if(i<0) return null; let arr= this.getObjs(); return arr[i] } public delete( obj:ViggleTask ){ if(!obj.taskID ) throw "id must"; let arr= this.getObjs(); let i= arr.findIndex( v=>v.taskID==obj.taskID ); if(i<0) return false arr.splice(i, 1); ss.set(this.localKey, arr ); return true; } } ================================================ FILE: src/assets/recommend.json ================================================ [ { "key": "awesome-chatgpt-prompts-zh", "desc": "ChatGPT 中文调教指南", "downloadUrl": "https://raw.githubusercontent.com/PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh.json", "url": "https://github.com/PlexPt/awesome-chatgpt-prompts-zh" }, { "key": "awesome-chatgpt-prompts-zh-TW", "desc": "ChatGPT 中文調教指南 (透過 OpenAI / OpenCC 協助,從簡體中文轉換為繁體中文的版本)", "downloadUrl": "https://raw.githubusercontent.com/PlexPt/awesome-chatgpt-prompts-zh/main/prompts-zh-TW.json", "url": "https://github.com/PlexPt/awesome-chatgpt-prompts-zh" } ] ================================================ FILE: src/components/common/HoverButton/Button.vue ================================================ ================================================ FILE: src/components/common/HoverButton/index.vue ================================================ ================================================ FILE: src/components/common/NaiveProvider/index.vue ================================================ ================================================ FILE: src/components/common/PromptStore/index.vue ================================================ ================================================ FILE: src/components/common/Setting/About.vue ================================================ ================================================ FILE: src/components/common/Setting/Advanced.vue ================================================ ================================================ FILE: src/components/common/Setting/General.vue ================================================ ================================================ FILE: src/components/common/Setting/index.vue ================================================ ================================================ FILE: src/components/common/SvgIcon/index.vue ================================================ ================================================ FILE: src/components/common/UserAvatar/index.vue ================================================ ================================================ FILE: src/components/common/index.ts ================================================ import HoverButton from './HoverButton/index.vue' import NaiveProvider from './NaiveProvider/index.vue' import SvgIcon from './SvgIcon/index.vue' import UserAvatar from './UserAvatar/index.vue' import Setting from './Setting/index.vue' import PromptStore from './PromptStore/index.vue' export { HoverButton, NaiveProvider, SvgIcon, UserAvatar, Setting, PromptStore } ================================================ FILE: src/components/custom/GithubSite.vue ================================================ ================================================ FILE: src/components/custom/index.ts ================================================ import GithubSite from './GithubSite.vue' export { GithubSite } ================================================ FILE: src/hooks/useBasicLayout.ts ================================================ import { breakpointsTailwind, useBreakpoints } from '@vueuse/core' export function useBasicLayout() { const breakpoints = useBreakpoints(breakpointsTailwind) const isMobile = breakpoints.smaller('sm') return { isMobile } } ================================================ FILE: src/hooks/useIconRender.ts ================================================ import { h } from 'vue' import { SvgIcon } from '@/components/common' export const useIconRender = () => { interface IconConfig { icon?: string color?: string fontSize?: number } interface IconStyle { color?: string fontSize?: string } const iconRender = (config: IconConfig) => { const { color, fontSize, icon } = config const style: IconStyle = {} if (color) style.color = color if (fontSize) style.fontSize = `${fontSize}px` if (!icon) window.console.warn('iconRender: icon is required') return () => h(SvgIcon, { icon, style }) } return { iconRender, } } ================================================ FILE: src/hooks/useLanguage.ts ================================================ import { computed } from 'vue' import { enUS, koKR, zhCN, zhTW } from 'naive-ui' import { useAppStore } from '@/store' import { setLocale } from '@/locales' export function useLanguage() { const appStore = useAppStore() const language = computed(() => { switch (appStore.language) { case 'en-US': setLocale('en-US') return enUS case 'ru-RU': setLocale('ru-RU') return enUS case 'ko-KR': setLocale('ko-KR') return koKR case 'zh-CN': setLocale('zh-CN') return zhCN case 'zh-TW': setLocale('zh-TW') return zhTW case 'vi-VN': setLocale('vi-VN') return zhTW case 'fr-FR': setLocale('fr-FR') return enUS case 'tr-TR': setLocale('tr-TR') return enUS default: setLocale('zh-CN') return zhCN } }) return { language } } ================================================ FILE: src/hooks/useTheme.ts ================================================ import type { GlobalThemeOverrides } from 'naive-ui' import { computed, watch } from 'vue' import { darkTheme, useOsTheme } from 'naive-ui' import { useAppStore } from '@/store' export function useTheme() { const appStore = useAppStore() const OsTheme = useOsTheme() const isDark = computed(() => { if (appStore.theme === 'auto') return OsTheme.value === 'dark' else return appStore.theme === 'dark' }) const theme = computed(() => { return isDark.value ? darkTheme : undefined }) const themeOverrides = computed(() => { if (isDark.value) { return { common: {}, } } return {} }) watch( () => isDark.value, (dark) => { if (dark) document.documentElement.classList.add('dark') else document.documentElement.classList.remove('dark') }, { immediate: true }, ) return { theme, themeOverrides } } ================================================ FILE: src/icons/403.vue ================================================ ================================================ FILE: src/icons/500.vue ================================================ ================================================ FILE: src/lib/wavtools/index.js ================================================ import { WavPacker } from './lib/wav_packer.js'; import { AudioAnalysis } from './lib/analysis/audio_analysis.js'; import { WavStreamPlayer } from './lib/wav_stream_player.js'; import { WavRecorder } from './lib/wav_recorder.js'; export { AudioAnalysis, WavPacker, WavStreamPlayer, WavRecorder }; ================================================ FILE: src/lib/wavtools/lib/analysis/audio_analysis.js ================================================ import { noteFrequencies, noteFrequencyLabels, voiceFrequencies, voiceFrequencyLabels, } from './constants.js'; /** * Output of AudioAnalysis for the frequency domain of the audio * @typedef {Object} AudioAnalysisOutputType * @property {Float32Array} values Amplitude of this frequency between {0, 1} inclusive * @property {number[]} frequencies Raw frequency bucket values * @property {string[]} labels Labels for the frequency bucket values */ /** * Analyzes audio for visual output * @class */ export class AudioAnalysis { /** * Retrieves frequency domain data from an AnalyserNode adjusted to a decibel range * returns human-readable formatting and labels * @param {AnalyserNode} analyser * @param {number} sampleRate * @param {Float32Array} [fftResult] * @param {"frequency"|"music"|"voice"} [analysisType] * @param {number} [minDecibels] default -100 * @param {number} [maxDecibels] default -30 * @returns {AudioAnalysisOutputType} */ static getFrequencies( analyser, sampleRate, fftResult, analysisType = 'frequency', minDecibels = -100, maxDecibels = -30, ) { if (!fftResult) { fftResult = new Float32Array(analyser.frequencyBinCount); analyser.getFloatFrequencyData(fftResult); } const nyquistFrequency = sampleRate / 2; const frequencyStep = (1 / fftResult.length) * nyquistFrequency; let outputValues; let frequencies; let labels; if (analysisType === 'music' || analysisType === 'voice') { const useFrequencies = analysisType === 'voice' ? voiceFrequencies : noteFrequencies; const aggregateOutput = Array(useFrequencies.length).fill(minDecibels); for (let i = 0; i < fftResult.length; i++) { const frequency = i * frequencyStep; const amplitude = fftResult[i]; for (let n = useFrequencies.length - 1; n >= 0; n--) { if (frequency > useFrequencies[n]) { aggregateOutput[n] = Math.max(aggregateOutput[n], amplitude); break; } } } outputValues = aggregateOutput; frequencies = analysisType === 'voice' ? voiceFrequencies : noteFrequencies; labels = analysisType === 'voice' ? voiceFrequencyLabels : noteFrequencyLabels; } else { outputValues = Array.from(fftResult); frequencies = outputValues.map((_, i) => frequencyStep * i); labels = frequencies.map((f) => `${f.toFixed(2)} Hz`); } // We normalize to {0, 1} const normalizedOutput = outputValues.map((v) => { return Math.max( 0, Math.min((v - minDecibels) / (maxDecibels - minDecibels), 1), ); }); const values = new Float32Array(normalizedOutput); return { values, frequencies, labels, }; } /** * Creates a new AudioAnalysis instance for an HTMLAudioElement * @param {HTMLAudioElement} audioElement * @param {AudioBuffer|null} [audioBuffer] If provided, will cache all frequency domain data from the buffer * @returns {AudioAnalysis} */ constructor(audioElement, audioBuffer = null) { this.fftResults = []; if (audioBuffer) { /** * Modified from * https://stackoverflow.com/questions/75063715/using-the-web-audio-api-to-analyze-a-song-without-playing * * We do this to populate FFT values for the audio if provided an `audioBuffer` * The reason to do this is that Safari fails when using `createMediaElementSource` * This has a non-zero RAM cost so we only opt-in to run it on Safari, Chrome is better */ const { length, sampleRate } = audioBuffer; const offlineAudioContext = new OfflineAudioContext({ length, sampleRate, }); const source = offlineAudioContext.createBufferSource(); source.buffer = audioBuffer; const analyser = offlineAudioContext.createAnalyser(); analyser.fftSize = 8192; analyser.smoothingTimeConstant = 0.1; source.connect(analyser); // limit is :: 128 / sampleRate; // but we just want 60fps - cuts ~1s from 6MB to 1MB of RAM const renderQuantumInSeconds = 1 / 60; const durationInSeconds = length / sampleRate; const analyze = (index) => { const suspendTime = renderQuantumInSeconds * index; if (suspendTime < durationInSeconds) { offlineAudioContext.suspend(suspendTime).then(() => { const fftResult = new Float32Array(analyser.frequencyBinCount); analyser.getFloatFrequencyData(fftResult); this.fftResults.push(fftResult); analyze(index + 1); }); } if (index === 1) { offlineAudioContext.startRendering(); } else { offlineAudioContext.resume(); } }; source.start(0); analyze(1); this.audio = audioElement; this.context = offlineAudioContext; this.analyser = analyser; this.sampleRate = sampleRate; this.audioBuffer = audioBuffer; } else { const audioContext = new AudioContext(); const track = audioContext.createMediaElementSource(audioElement); const analyser = audioContext.createAnalyser(); analyser.fftSize = 8192; analyser.smoothingTimeConstant = 0.1; track.connect(analyser); analyser.connect(audioContext.destination); this.audio = audioElement; this.context = audioContext; this.analyser = analyser; this.sampleRate = this.context.sampleRate; this.audioBuffer = null; } } /** * Gets the current frequency domain data from the playing audio track * @param {"frequency"|"music"|"voice"} [analysisType] * @param {number} [minDecibels] default -100 * @param {number} [maxDecibels] default -30 * @returns {AudioAnalysisOutputType} */ getFrequencies( analysisType = 'frequency', minDecibels = -100, maxDecibels = -30, ) { let fftResult = null; if (this.audioBuffer && this.fftResults.length) { const pct = this.audio.currentTime / this.audio.duration; const index = Math.min( (pct * this.fftResults.length) | 0, this.fftResults.length - 1, ); fftResult = this.fftResults[index]; } return AudioAnalysis.getFrequencies( this.analyser, this.sampleRate, fftResult, analysisType, minDecibels, maxDecibels, ); } /** * Resume the internal AudioContext if it was suspended due to the lack of * user interaction when the AudioAnalysis was instantiated. * @returns {Promise} */ async resumeIfSuspended() { if (this.context.state === 'suspended') { await this.context.resume(); } return true; } } globalThis.AudioAnalysis = AudioAnalysis; ================================================ FILE: src/lib/wavtools/lib/analysis/constants.js ================================================ /** * Constants for help with visualization * Helps map frequency ranges from Fast Fourier Transform * to human-interpretable ranges, notably music ranges and * human vocal ranges. */ // Eighth octave frequencies const octave8Frequencies = [ 4186.01, 4434.92, 4698.63, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040.0, 7458.62, 7902.13, ]; // Labels for each of the above frequencies const octave8FrequencyLabels = [ 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', ]; /** * All note frequencies from 1st to 8th octave * in format "A#8" (A#, 8th octave) */ export const noteFrequencies = []; export const noteFrequencyLabels = []; for (let i = 1; i <= 8; i++) { for (let f = 0; f < octave8Frequencies.length; f++) { const freq = octave8Frequencies[f]; noteFrequencies.push(freq / Math.pow(2, 8 - i)); noteFrequencyLabels.push(octave8FrequencyLabels[f] + i); } } /** * Subset of the note frequencies between 32 and 2000 Hz * 6 octave range: C1 to B6 */ const voiceFrequencyRange = [32.0, 2000.0]; export const voiceFrequencies = noteFrequencies.filter((_, i) => { return ( noteFrequencies[i] > voiceFrequencyRange[0] && noteFrequencies[i] < voiceFrequencyRange[1] ); }); export const voiceFrequencyLabels = noteFrequencyLabels.filter((_, i) => { return ( noteFrequencies[i] > voiceFrequencyRange[0] && noteFrequencies[i] < voiceFrequencyRange[1] ); }); ================================================ FILE: src/lib/wavtools/lib/wav_packer.js ================================================ /** * Raw wav audio file contents * @typedef {Object} WavPackerAudioType * @property {Blob} blob * @property {string} url * @property {number} channelCount * @property {number} sampleRate * @property {number} duration */ /** * Utility class for assembling PCM16 "audio/wav" data * @class */ export class WavPacker { /** * Converts Float32Array of amplitude data to ArrayBuffer in Int16Array format * @param {Float32Array} float32Array * @returns {ArrayBuffer} */ static floatTo16BitPCM(float32Array) { const buffer = new ArrayBuffer(float32Array.length * 2); const view = new DataView(buffer); let offset = 0; for (let i = 0; i < float32Array.length; i++, offset += 2) { let s = Math.max(-1, Math.min(1, float32Array[i])); view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true); } return buffer; } /** * Concatenates two ArrayBuffers * @param {ArrayBuffer} leftBuffer * @param {ArrayBuffer} rightBuffer * @returns {ArrayBuffer} */ static mergeBuffers(leftBuffer, rightBuffer) { const tmpArray = new Uint8Array( leftBuffer.byteLength + rightBuffer.byteLength ); tmpArray.set(new Uint8Array(leftBuffer), 0); tmpArray.set(new Uint8Array(rightBuffer), leftBuffer.byteLength); return tmpArray.buffer; } /** * Packs data into an Int16 format * @private * @param {number} size 0 = 1x Int16, 1 = 2x Int16 * @param {number} arg value to pack * @returns */ _packData(size, arg) { return [ new Uint8Array([arg, arg >> 8]), new Uint8Array([arg, arg >> 8, arg >> 16, arg >> 24]), ][size]; } /** * Packs audio into "audio/wav" Blob * @param {number} sampleRate * @param {{bitsPerSample: number, channels: Array, data: Int16Array}} audio * @returns {WavPackerAudioType} */ pack(sampleRate, audio) { if (!audio?.bitsPerSample) { throw new Error(`Missing "bitsPerSample"`); } else if (!audio?.channels) { throw new Error(`Missing "channels"`); } else if (!audio?.data) { throw new Error(`Missing "data"`); } const { bitsPerSample, channels, data } = audio; const output = [ // Header 'RIFF', this._packData( 1, 4 + (8 + 24) /* chunk 1 length */ + (8 + 8) /* chunk 2 length */ ), // Length 'WAVE', // chunk 1 'fmt ', // Sub-chunk identifier this._packData(1, 16), // Chunk length this._packData(0, 1), // Audio format (1 is linear quantization) this._packData(0, channels.length), this._packData(1, sampleRate), this._packData(1, (sampleRate * channels.length * bitsPerSample) / 8), // Byte rate this._packData(0, (channels.length * bitsPerSample) / 8), this._packData(0, bitsPerSample), // chunk 2 'data', // Sub-chunk identifier this._packData( 1, (channels[0].length * channels.length * bitsPerSample) / 8 ), // Chunk length data, ]; const blob = new Blob(output, { type: 'audio/mpeg' }); const url = URL.createObjectURL(blob); return { blob, url, channelCount: channels.length, sampleRate, duration: data.byteLength / (channels.length * sampleRate * 2), }; } } globalThis.WavPacker = WavPacker; ================================================ FILE: src/lib/wavtools/lib/wav_recorder.js ================================================ import { AudioProcessorSrc } from './worklets/audio_processor.js'; import { AudioAnalysis } from './analysis/audio_analysis.js'; import { WavPacker } from './wav_packer.js'; /** * Decodes audio into a wav file * @typedef {Object} DecodedAudioType * @property {Blob} blob * @property {string} url * @property {Float32Array} values * @property {AudioBuffer} audioBuffer */ /** * Records live stream of user audio as PCM16 "audio/wav" data * @class */ export class WavRecorder { /** * Create a new WavRecorder instance * @param {{sampleRate?: number, outputToSpeakers?: boolean, debug?: boolean}} [options] * @returns {WavRecorder} */ constructor({ sampleRate = 44100, outputToSpeakers = false, debug = false, } = {}) { // Script source this.scriptSrc = AudioProcessorSrc; // Config this.sampleRate = sampleRate; this.outputToSpeakers = outputToSpeakers; this.debug = !!debug; this._deviceChangeCallback = null; this._devices = []; // State variables this.stream = null; this.processor = null; this.source = null; this.node = null; this.recording = false; // Event handling with AudioWorklet this._lastEventId = 0; this.eventReceipts = {}; this.eventTimeout = 5000; // Process chunks of audio this._chunkProcessor = () => {}; this._chunkProcessorSize = void 0; this._chunkProcessorBuffer = { raw: new ArrayBuffer(0), mono: new ArrayBuffer(0), }; } /** * Decodes audio data from multiple formats to a Blob, url, Float32Array and AudioBuffer * @param {Blob|Float32Array|Int16Array|ArrayBuffer|number[]} audioData * @param {number} sampleRate * @param {number} fromSampleRate * @returns {Promise} */ static async decode(audioData, sampleRate = 44100, fromSampleRate = -1) { const context = new AudioContext({ sampleRate }); let arrayBuffer; let blob; if (audioData instanceof Blob) { if (fromSampleRate !== -1) { throw new Error( `Can not specify "fromSampleRate" when reading from Blob`, ); } blob = audioData; arrayBuffer = await blob.arrayBuffer(); } else if (audioData instanceof ArrayBuffer) { if (fromSampleRate !== -1) { throw new Error( `Can not specify "fromSampleRate" when reading from ArrayBuffer`, ); } arrayBuffer = audioData; blob = new Blob([arrayBuffer], { type: 'audio/wav' }); } else { let float32Array; let data; if (audioData instanceof Int16Array) { data = audioData; float32Array = new Float32Array(audioData.length); for (let i = 0; i < audioData.length; i++) { float32Array[i] = audioData[i] / 0x8000; } } else if (audioData instanceof Float32Array) { float32Array = audioData; } else if (audioData instanceof Array) { float32Array = new Float32Array(audioData); } else { throw new Error( `"audioData" must be one of: Blob, Float32Arrray, Int16Array, ArrayBuffer, Array`, ); } if (fromSampleRate === -1) { throw new Error( `Must specify "fromSampleRate" when reading from Float32Array, In16Array or Array`, ); } else if (fromSampleRate < 3000) { throw new Error(`Minimum "fromSampleRate" is 3000 (3kHz)`); } if (!data) { data = WavPacker.floatTo16BitPCM(float32Array); } const audio = { bitsPerSample: 16, channels: [float32Array], data, }; const packer = new WavPacker(); const result = packer.pack(fromSampleRate, audio); blob = result.blob; arrayBuffer = await blob.arrayBuffer(); } const audioBuffer = await context.decodeAudioData(arrayBuffer); const values = audioBuffer.getChannelData(0); const url = URL.createObjectURL(blob); return { blob, url, values, audioBuffer, }; } /** * Logs data in debug mode * @param {...any} arguments * @returns {true} */ log() { if (this.debug) { this.log(...arguments); } return true; } /** * Retrieves the current sampleRate for the recorder * @returns {number} */ getSampleRate() { return this.sampleRate; } /** * Retrieves the current status of the recording * @returns {"ended"|"paused"|"recording"} */ getStatus() { if (!this.processor) { return 'ended'; } else if (!this.recording) { return 'paused'; } else { return 'recording'; } } /** * Sends an event to the AudioWorklet * @private * @param {string} name * @param {{[key: string]: any}} data * @param {AudioWorkletNode} [_processor] * @returns {Promise<{[key: string]: any}>} */ async _event(name, data = {}, _processor = null) { _processor = _processor || this.processor; if (!_processor) { throw new Error('Can not send events without recording first'); } const message = { event: name, id: this._lastEventId++, data, }; _processor.port.postMessage(message); const t0 = new Date().valueOf(); while (!this.eventReceipts[message.id]) { if (new Date().valueOf() - t0 > this.eventTimeout) { throw new Error(`Timeout waiting for "${name}" event`); } await new Promise((res) => setTimeout(() => res(true), 1)); } const payload = this.eventReceipts[message.id]; delete this.eventReceipts[message.id]; return payload; } /** * Sets device change callback, remove if callback provided is `null` * @param {(Array): void|null} callback * @returns {true} */ listenForDeviceChange(callback) { if (callback === null && this._deviceChangeCallback) { navigator.mediaDevices.removeEventListener( 'devicechange', this._deviceChangeCallback, ); this._deviceChangeCallback = null; } else if (callback !== null) { // Basically a debounce; we only want this called once when devices change // And we only want the most recent callback() to be executed // if a few are operating at the same time let lastId = 0; let lastDevices = []; const serializeDevices = (devices) => devices .map((d) => d.deviceId) .sort() .join(','); const cb = async () => { let id = ++lastId; const devices = await this.listDevices(); if (id === lastId) { if (serializeDevices(lastDevices) !== serializeDevices(devices)) { lastDevices = devices; callback(devices.slice()); } } }; navigator.mediaDevices.addEventListener('devicechange', cb); cb(); this._deviceChangeCallback = cb; } return true; } /** * Manually request permission to use the microphone * @returns {Promise} */ async requestPermission() { const permissionStatus = await navigator.permissions.query({ name: 'microphone', }); if (permissionStatus.state === 'denied') { window.alert('You must grant microphone access to use this feature.'); } else if (permissionStatus.state === 'prompt') { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, }); const tracks = stream.getTracks(); tracks.forEach((track) => track.stop()); } catch (e) { window.alert('You must grant microphone access to use this feature.'); } } return true; } /** * List all eligible devices for recording, will request permission to use microphone * @returns {Promise>} */ async listDevices() { if ( !navigator.mediaDevices || !('enumerateDevices' in navigator.mediaDevices) ) { throw new Error('Could not request user devices'); } await this.requestPermission(); const devices = await navigator.mediaDevices.enumerateDevices(); const audioDevices = devices.filter( (device) => device.kind === 'audioinput', ); const defaultDeviceIndex = audioDevices.findIndex( (device) => device.deviceId === 'default', ); const deviceList = []; if (defaultDeviceIndex !== -1) { let defaultDevice = audioDevices.splice(defaultDeviceIndex, 1)[0]; let existingIndex = audioDevices.findIndex( (device) => device.groupId === defaultDevice.groupId, ); if (existingIndex !== -1) { defaultDevice = audioDevices.splice(existingIndex, 1)[0]; } defaultDevice.default = true; deviceList.push(defaultDevice); } return deviceList.concat(audioDevices); } /** * Begins a recording session and requests microphone permissions if not already granted * Microphone recording indicator will appear on browser tab but status will be "paused" * @param {string} [deviceId] if no device provided, default device will be used * @returns {Promise} */ async begin(deviceId) { if (this.processor) { throw new Error( `Already connected: please call .end() to start a new session`, ); } if ( !navigator.mediaDevices || !('getUserMedia' in navigator.mediaDevices) ) { throw new Error('Could not request user media'); } try { const config = { audio: true }; if (deviceId) { config.audio = { deviceId: { exact: deviceId } }; } this.stream = await navigator.mediaDevices.getUserMedia(config); } catch (err) { throw new Error('Could not start media stream'); } const context = new AudioContext({ sampleRate: this.sampleRate }); const source = context.createMediaStreamSource(this.stream); // Load and execute the module script. try { await context.audioWorklet.addModule(this.scriptSrc); } catch (e) { console.error(e); throw new Error(`Could not add audioWorklet module: ${this.scriptSrc}`); } const processor = new AudioWorkletNode(context, 'audio_processor'); processor.port.onmessage = (e) => { const { event, id, data } = e.data; if (event === 'receipt') { this.eventReceipts[id] = data; } else if (event === 'chunk') { if (this._chunkProcessorSize) { const buffer = this._chunkProcessorBuffer; this._chunkProcessorBuffer = { raw: WavPacker.mergeBuffers(buffer.raw, data.raw), mono: WavPacker.mergeBuffers(buffer.mono, data.mono), }; if ( this._chunkProcessorBuffer.mono.byteLength >= this._chunkProcessorSize ) { this._chunkProcessor(this._chunkProcessorBuffer); this._chunkProcessorBuffer = { raw: new ArrayBuffer(0), mono: new ArrayBuffer(0), }; } } else { this._chunkProcessor(data); } } }; const node = source.connect(processor); const analyser = context.createAnalyser(); analyser.fftSize = 8192; analyser.smoothingTimeConstant = 0.1; node.connect(analyser); if (this.outputToSpeakers) { // eslint-disable-next-line no-console console.warn( 'Warning: Output to speakers may affect sound quality,\n' + 'especially due to system audio feedback preventative measures.\n' + 'use only for debugging', ); analyser.connect(context.destination); } this.source = source; this.node = node; this.analyser = analyser; this.processor = processor; return true; } /** * Gets the current frequency domain data from the recording track * @param {"frequency"|"music"|"voice"} [analysisType] * @param {number} [minDecibels] default -100 * @param {number} [maxDecibels] default -30 * @returns {import('./analysis/audio_analysis.js').AudioAnalysisOutputType} */ getFrequencies( analysisType = 'frequency', minDecibels = -100, maxDecibels = -30, ) { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } return AudioAnalysis.getFrequencies( this.analyser, this.sampleRate, null, analysisType, minDecibels, maxDecibels, ); } /** * Pauses the recording * Keeps microphone stream open but halts storage of audio * @returns {Promise} */ async pause() { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } else if (!this.recording) { throw new Error('Already paused: please call .record() first'); } if (this._chunkProcessorBuffer.raw.byteLength) { this._chunkProcessor(this._chunkProcessorBuffer); } this.log('Pausing ...'); await this._event('stop'); this.recording = false; return true; } /** * Start recording stream and storing to memory from the connected audio source * @param {(data: { mono: Int16Array; raw: Int16Array }) => any} [chunkProcessor] * @param {number} [chunkSize] chunkProcessor will not be triggered until this size threshold met in mono audio * @returns {Promise} */ async record(chunkProcessor = () => {}, chunkSize = 8192) { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } else if (this.recording) { throw new Error('Already recording: please call .pause() first'); } else if (typeof chunkProcessor !== 'function') { throw new Error(`chunkProcessor must be a function`); } this._chunkProcessor = chunkProcessor; this._chunkProcessorSize = chunkSize; this._chunkProcessorBuffer = { raw: new ArrayBuffer(0), mono: new ArrayBuffer(0), }; this.log('Recording ...'); await this._event('start'); this.recording = true; return true; } /** * Clears the audio buffer, empties stored recording * @returns {Promise} */ async clear() { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } await this._event('clear'); return true; } /** * Reads the current audio stream data * @returns {Promise<{meanValues: Float32Array, channels: Array}>} */ async read() { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } this.log('Reading ...'); const result = await this._event('read'); return result; } /** * Saves the current audio stream to a file * @param {boolean} [force] Force saving while still recording * @returns {Promise} */ async save(force = false) { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } if (!force && this.recording) { throw new Error( 'Currently recording: please call .pause() first, or call .save(true) to force', ); } this.log('Exporting ...'); const exportData = await this._event('export'); const packer = new WavPacker(); const result = packer.pack(this.sampleRate, exportData.audio); return result; } /** * Ends the current recording session and saves the result * @returns {Promise} */ async end() { if (!this.processor) { throw new Error('Session ended: please call .begin() first'); } const _processor = this.processor; this.log('Stopping ...'); await this._event('stop'); this.recording = false; const tracks = this.stream.getTracks(); tracks.forEach((track) => track.stop()); this.log('Exporting ...'); const exportData = await this._event('export', {}, _processor); this.processor.disconnect(); this.source.disconnect(); this.node.disconnect(); this.analyser.disconnect(); this.stream = null; this.processor = null; this.source = null; this.node = null; const packer = new WavPacker(); const result = packer.pack(this.sampleRate, exportData.audio); return result; } /** * Performs a full cleanup of WavRecorder instance * Stops actively listening via microphone and removes existing listeners * @returns {Promise} */ async quit() { this.listenForDeviceChange(null); if (this.processor) { await this.end(); } return true; } } globalThis.WavRecorder = WavRecorder; ================================================ FILE: src/lib/wavtools/lib/wav_stream_player.js ================================================ import { StreamProcessorSrc } from './worklets/stream_processor.js'; import { AudioAnalysis } from './analysis/audio_analysis.js'; /** * Plays audio streams received in raw PCM16 chunks from the browser * @class */ export class WavStreamPlayer { /** * Creates a new WavStreamPlayer instance * @param {{sampleRate?: number}} options * @returns {WavStreamPlayer} */ constructor({ sampleRate = 44100 } = {}) { this.scriptSrc = StreamProcessorSrc; this.sampleRate = sampleRate; this.context = null; this.stream = null; this.analyser = null; this.trackSampleOffsets = {}; this.interruptedTrackIds = {}; } /** * Connects the audio context and enables output to speakers * @returns {Promise} */ async connect() { this.context = new AudioContext({ sampleRate: this.sampleRate }); if (this.context.state === 'suspended') { await this.context.resume(); } try { await this.context.audioWorklet.addModule(this.scriptSrc); } catch (e) { console.error(e); throw new Error(`Could not add audioWorklet module: ${this.scriptSrc}`); } const analyser = this.context.createAnalyser(); analyser.fftSize = 8192; analyser.smoothingTimeConstant = 0.1; this.analyser = analyser; return true; } /** * Gets the current frequency domain data from the playing track * @param {"frequency"|"music"|"voice"} [analysisType] * @param {number} [minDecibels] default -100 * @param {number} [maxDecibels] default -30 * @returns {import('./analysis/audio_analysis.js').AudioAnalysisOutputType} */ getFrequencies( analysisType = 'frequency', minDecibels = -100, maxDecibels = -30 ) { if (!this.analyser) { throw new Error('Not connected, please call .connect() first'); } return AudioAnalysis.getFrequencies( this.analyser, this.sampleRate, null, analysisType, minDecibels, maxDecibels ); } /** * Starts audio streaming * @private * @returns {Promise} */ _start() { const streamNode = new AudioWorkletNode(this.context, 'stream_processor'); streamNode.connect(this.context.destination); streamNode.port.onmessage = (e) => { const { event } = e.data; if (event === 'stop') { streamNode.disconnect(); this.stream = null; } else if (event === 'offset') { const { requestId, trackId, offset } = e.data; const currentTime = offset / this.sampleRate; this.trackSampleOffsets[requestId] = { trackId, offset, currentTime }; } }; this.analyser.disconnect(); streamNode.connect(this.analyser); this.stream = streamNode; return true; } /** * Adds 16BitPCM data to the currently playing audio stream * You can add chunks beyond the current play point and they will be queued for play * @param {ArrayBuffer|Int16Array} arrayBuffer * @param {string} [trackId] * @returns {Int16Array} */ add16BitPCM(arrayBuffer, trackId = 'default') { if (typeof trackId !== 'string') { throw new Error(`trackId must be a string`); } else if (this.interruptedTrackIds[trackId]) { return; } if (!this.stream) { this._start(); } let buffer; if (arrayBuffer instanceof Int16Array) { buffer = arrayBuffer; } else if (arrayBuffer instanceof ArrayBuffer) { buffer = new Int16Array(arrayBuffer); } else { throw new Error(`argument must be Int16Array or ArrayBuffer`); } this.stream.port.postMessage({ event: 'write', buffer, trackId }); return buffer; } /** * Gets the offset (sample count) of the currently playing stream * @param {boolean} [interrupt] * @returns {{trackId: string|null, offset: number, currentTime: number}} */ async getTrackSampleOffset(interrupt = false) { if (!this.stream) { return null; } const requestId = crypto.randomUUID(); this.stream.port.postMessage({ event: interrupt ? 'interrupt' : 'offset', requestId, }); let trackSampleOffset; while (!trackSampleOffset) { trackSampleOffset = this.trackSampleOffsets[requestId]; await new Promise((r) => setTimeout(() => r(), 1)); } const { trackId } = trackSampleOffset; if (interrupt && trackId) { this.interruptedTrackIds[trackId] = true; } return trackSampleOffset; } /** * Strips the current stream and returns the sample offset of the audio * @param {boolean} [interrupt] * @returns {{trackId: string|null, offset: number, currentTime: number}} */ async interrupt() { return this.getTrackSampleOffset(true); } } globalThis.WavStreamPlayer = WavStreamPlayer; ================================================ FILE: src/lib/wavtools/lib/worklets/audio_processor.js ================================================ const AudioProcessorWorklet = ` class AudioProcessor extends AudioWorkletProcessor { constructor() { super(); this.port.onmessage = this.receive.bind(this); this.initialize(); } initialize() { this.foundAudio = false; this.recording = false; this.chunks = []; } /** * Concatenates sampled chunks into channels * Format is chunk[Left[], Right[]] */ readChannelData(chunks, channel = -1, maxChannels = 9) { let channelLimit; if (channel !== -1) { if (chunks[0] && chunks[0].length - 1 < channel) { throw new Error( \`Channel \${channel} out of range: max \${chunks[0].length}\` ); } channelLimit = channel + 1; } else { channel = 0; channelLimit = Math.min(chunks[0] ? chunks[0].length : 1, maxChannels); } const channels = []; for (let n = channel; n < channelLimit; n++) { const length = chunks.reduce((sum, chunk) => { return sum + chunk[n].length; }, 0); const buffers = chunks.map((chunk) => chunk[n]); const result = new Float32Array(length); let offset = 0; for (let i = 0; i < buffers.length; i++) { result.set(buffers[i], offset); offset += buffers[i].length; } channels[n] = result; } return channels; } /** * Combines parallel audio data into correct format, * channels[Left[], Right[]] to float32Array[LRLRLRLR...] */ formatAudioData(channels) { if (channels.length === 1) { // Simple case is only one channel const float32Array = channels[0].slice(); const meanValues = channels[0].slice(); return { float32Array, meanValues }; } else { const float32Array = new Float32Array( channels[0].length * channels.length ); const meanValues = new Float32Array(channels[0].length); for (let i = 0; i < channels[0].length; i++) { const offset = i * channels.length; let meanValue = 0; for (let n = 0; n < channels.length; n++) { float32Array[offset + n] = channels[n][i]; meanValue += channels[n][i]; } meanValues[i] = meanValue / channels.length; } return { float32Array, meanValues }; } } /** * Converts 32-bit float data to 16-bit integers */ floatTo16BitPCM(float32Array) { const buffer = new ArrayBuffer(float32Array.length * 2); const view = new DataView(buffer); let offset = 0; for (let i = 0; i < float32Array.length; i++, offset += 2) { let s = Math.max(-1, Math.min(1, float32Array[i])); view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true); } return buffer; } /** * Retrieves the most recent amplitude values from the audio stream * @param {number} channel */ getValues(channel = -1) { const channels = this.readChannelData(this.chunks, channel); const { meanValues } = this.formatAudioData(channels); return { meanValues, channels }; } /** * Exports chunks as an audio/wav file */ export() { const channels = this.readChannelData(this.chunks); const { float32Array, meanValues } = this.formatAudioData(channels); const audioData = this.floatTo16BitPCM(float32Array); return { meanValues: meanValues, audio: { bitsPerSample: 16, channels: channels, data: audioData, }, }; } receive(e) { const { event, id } = e.data; let receiptData = {}; switch (event) { case 'start': this.recording = true; break; case 'stop': this.recording = false; break; case 'clear': this.initialize(); break; case 'export': receiptData = this.export(); break; case 'read': receiptData = this.getValues(); break; default: break; } // Always send back receipt this.port.postMessage({ event: 'receipt', id, data: receiptData }); } sendChunk(chunk) { const channels = this.readChannelData([chunk]); const { float32Array, meanValues } = this.formatAudioData(channels); const rawAudioData = this.floatTo16BitPCM(float32Array); const monoAudioData = this.floatTo16BitPCM(meanValues); this.port.postMessage({ event: 'chunk', data: { mono: monoAudioData, raw: rawAudioData, }, }); } process(inputList, outputList, parameters) { // Copy input to output (e.g. speakers) // Note that this creates choppy sounds with Mac products const sourceLimit = Math.min(inputList.length, outputList.length); for (let inputNum = 0; inputNum < sourceLimit; inputNum++) { const input = inputList[inputNum]; const output = outputList[inputNum]; const channelCount = Math.min(input.length, output.length); for (let channelNum = 0; channelNum < channelCount; channelNum++) { input[channelNum].forEach((sample, i) => { output[channelNum][i] = sample; }); } } const inputs = inputList[0]; // There's latency at the beginning of a stream before recording starts // Make sure we actually receive audio data before we start storing chunks let sliceIndex = 0; if (!this.foundAudio) { for (const channel of inputs) { sliceIndex = 0; // reset for each channel if (this.foundAudio) { break; } if (channel) { for (const value of channel) { if (value !== 0) { // find only one non-zero entry in any channel this.foundAudio = true; break; } else { sliceIndex++; } } } } } if (inputs && inputs[0] && this.foundAudio && this.recording) { // We need to copy the TypedArray, because the \`process\` // internals will reuse the same buffer to hold each input const chunk = inputs.map((input) => input.slice(sliceIndex)); this.chunks.push(chunk); this.sendChunk(chunk); } return true; } } registerProcessor('audio_processor', AudioProcessor); `; const script = new Blob([AudioProcessorWorklet], { type: 'application/javascript', }); const src = URL.createObjectURL(script); export const AudioProcessorSrc = src; ================================================ FILE: src/lib/wavtools/lib/worklets/stream_processor.js ================================================ export const StreamProcessorWorklet = ` class StreamProcessor extends AudioWorkletProcessor { constructor() { super(); this.hasStarted = false; this.hasInterrupted = false; this.outputBuffers = []; this.bufferLength = 128; this.write = { buffer: new Float32Array(this.bufferLength), trackId: null }; this.writeOffset = 0; this.trackSampleOffsets = {}; this.port.onmessage = (event) => { if (event.data) { const payload = event.data; if (payload.event === 'write') { const int16Array = payload.buffer; const float32Array = new Float32Array(int16Array.length); for (let i = 0; i < int16Array.length; i++) { float32Array[i] = int16Array[i] / 0x8000; // Convert Int16 to Float32 } this.writeData(float32Array, payload.trackId); } else if ( payload.event === 'offset' || payload.event === 'interrupt' ) { const requestId = payload.requestId; const trackId = this.write.trackId; const offset = this.trackSampleOffsets[trackId] || 0; this.port.postMessage({ event: 'offset', requestId, trackId, offset, }); if (payload.event === 'interrupt') { this.hasInterrupted = true; } } else { throw new Error(\`Unhandled event "\${payload.event}"\`); } } }; } writeData(float32Array, trackId = null) { let { buffer } = this.write; let offset = this.writeOffset; for (let i = 0; i < float32Array.length; i++) { buffer[offset++] = float32Array[i]; if (offset >= buffer.length) { this.outputBuffers.push(this.write); this.write = { buffer: new Float32Array(this.bufferLength), trackId }; buffer = this.write.buffer; offset = 0; } } this.writeOffset = offset; return true; } process(inputs, outputs, parameters) { const output = outputs[0]; const outputChannelData = output[0]; const outputBuffers = this.outputBuffers; if (this.hasInterrupted) { this.port.postMessage({ event: 'stop' }); return false; } else if (outputBuffers.length) { this.hasStarted = true; const { buffer, trackId } = outputBuffers.shift(); for (let i = 0; i < outputChannelData.length; i++) { outputChannelData[i] = buffer[i] || 0; } if (trackId) { this.trackSampleOffsets[trackId] = this.trackSampleOffsets[trackId] || 0; this.trackSampleOffsets[trackId] += buffer.length; } return true; } else if (this.hasStarted) { this.port.postMessage({ event: 'stop' }); return false; } else { return true; } } } registerProcessor('stream_processor', StreamProcessor); `; const script = new Blob([StreamProcessorWorklet], { type: 'application/javascript', }); const src = URL.createObjectURL(script); export const StreamProcessorSrc = src; ================================================ FILE: src/locales/en-US.ts ================================================ export default { common: { add: 'Add', addSuccess: 'Add Success', edit: 'Edit', editSuccess: 'Edit Success', delete: 'Delete', deleteSuccess: 'Delete Success', save: 'Save', saveSuccess: 'Save Success', reset: 'Reset', action: 'Action', export: 'Export', exportSuccess: 'Export Success', import: 'Import', importSuccess: 'Import Success', clear: 'Clear', clearSuccess: 'Clear Success', yes: 'Yes', no: 'No', confirm: 'Confirm', download: 'Download', noData: 'No Data', wrong: 'Something went wrong, please try again later.', success: 'Success', failed: 'Failed', verify: 'Verify', unauthorizedTips: 'Unauthorized, please verify first.', stopResponding: 'Stop Responding', }, chat: { newChatButton: 'New Chat', //placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)', placeholder: 'Ask me anything, or paste screenshots or drag the file .(Shift + Enter = line break, "/" to trigger prompts)', placeholderMobile: 'Ask me anything...', copy: 'Copy', copied: 'Copied', copyCode: 'Copy Code', clearChat: 'Clear Chat', clearChatConfirm: 'Are you sure to clear this chat?', exportImage: 'Export Image', exportImageConfirm: 'Are you sure to export this chat to png?', exportSuccess: 'Export Success', exportFailed: 'Export Failed', usingContext: 'Context Mode', turnOnContext: 'In the current mode, sending messages will carry previous chat records.', turnOffContext: 'In the current mode, sending messages will not carry previous chat records.', deleteMessage: 'Delete Message', deleteMessageConfirm: 'Are you sure to delete this message?', deleteHistoryConfirm: 'Are you sure to clear this history?', clearHistoryConfirm: 'Are you sure to clear chat history?', preview: 'Preview', showRawText: 'Show as raw text', }, setting: { setting: 'Setting', general: 'General', advanced: 'Advanced', config: 'Config', avatarLink: 'Avatar Link', name: 'Name', description: 'Description', role: 'Role', temperature: 'Temperature', top_p: 'Top_p', resetUserInfo: 'Reset UserInfo', chatHistory: 'ChatHistory', theme: 'Theme', language: 'Language', webdavSync: 'WebDAV Sync', webdavConfig: 'Configuration', webdavUrl: 'WebDAV URL', webdavUsername: 'Username', webdavPassword: 'Password', webdavConfigError: 'Please fill in the complete WebDAV configuration', webdavNotConfigured: 'Please configure WebDAV first', webdavSyncSuccess: 'Sync successful', webdavSyncError: 'Sync failed', webdavTest: 'Test Connection', webdavUpload: 'Upload', webdavDownload: 'Download', api: 'API', reverseProxy: 'Reverse Proxy', timeout: 'Timeout', socks: 'Socks', httpsProxy: 'HTTPS Proxy', balance: 'API Balance', monthlyUsage: 'Monthly Usage', }, store: { siderButton: 'Prompt Store', local: 'Local', online: 'Online', title: 'Title', description: 'Description', clearStoreConfirm: 'Whether to clear the data?', importPlaceholder: 'Please paste the JSON data here', addRepeatTitleTips: 'Title duplicate, please re-enter', addRepeatContentTips: 'Content duplicate: {msg}, please re-enter', editRepeatTitleTips: 'Title conflict, please revise', editRepeatContentTips: 'Content conflict {msg} , please re-modify', importError: 'Key value mismatch', importRepeatTitle: 'Title repeatedly skipped: {msg}', importRepeatContent: 'Content is repeatedly skipped: {msg}', onlineImportWarning: 'Note: Please check the JSON file source!', downloadError: 'Please check the network status and JSON file validity', }, "mj": { "setOpen": "OpenAI Related", "setOpenPlaceholder": "Must include http(s)://", "setOpenUrl": "OpenAI API Address", "setOpenKeyPlaceholder": "Use custom OpenAI Key to bypass password access restrictions", "setMj": "Midjourney Related", "setMjUrl": "Midjourney API Address:", "setMjKeyPlaceholder": "Use custom Api Secret to bypass password access restrictions", "setUploader": "Upload Related", "setUploaderUrl": "Upload Address:", "setBtSave": "Save", "setBtBack": "Restore Default", "redraw": "Redraw", "fail1": "Please be patient, it's loading.", "success1": "Image refreshed successfully!", "high_variation": "Strong Variation", "low_variation": "Weak Variation", "p15": "Zoom 1.5x", "p20": "Zoom 2x", "p100": "Normal", "retry": "Retry", "pan_left": "Left", "pan_right": "Right", "pan_up": "Up", "pan_down": "Down", "up2": "HD 2x", "up4": "HD 4x" , "thinking": "Thinking...", "noReUpload": "Cannot re-upload", "uploading": "Uploading...", "uploadSuccess": "Upload successful", "uploadFail": "Upload failed:", "upPdf": "Upload image or attachment
You can upload images, PDFs, EXCEL, and other documents

Supports drag and drop

", "upImg": "Upload image
Will automatically invoke the gpt-4-vision-preview model
Note: Additional image fees may apply
Formats: jpeg, jpg, png, gif

Supports drag and drop

Upload MP3 MP4
Will automatically invoke the whisper-1 model
Formats: mp3, mp4, mpeg, mpga, m4a, wav, webm

", "clearAll": "Clear parameters", "czoom": "Custom", "customTitle": "Custom zoom", "zoominfo": "Modify zoom value, range from 1.0 to 2.0, default is set to 1.8", "modleSuccess": "Model loaded successfully", "setingSuccess": "Settings successful", "tokenInfo1": "Remaining Tokens = Model Length - Role Setting - Context (Conversation History) - Replies Count - Current Input", "tokenInfo2": "Leave the role setting blank, and the system will provide a default one.", "noSuppertModel": "Refresh, this model is not currently supported!", "failOcr": "Recognition failed", "remain": "Remain:", "totalUsage": "Total subscription amount", "disableGpt4": "GPT4 disabled", "setTextInfo": "OpenAI API Key error, click here to retry", "attr1": "Attr", "ulink": "Image Link", "copyFail": "Copy Failed", "tts": "Text to Speech", "fail": "Error", "noSupperChrom": "Browser not supported!", "lang": "Voice", "ttsLoading": "Converting to Speech...", "ttsSuccess": "Conversion successful", "micIng": "Recording, say something...", "mStart": "Start", "mPause": "Pause", "mGoon": "Continue", "mRecord": "Re-record", "mPlay": "Play", "mCanel": "Cancel", "mSent": "Send", "findVersion": "Discover updated version", "yesLastVersion": "Already on the latest version", "infoStar": 'This project is open source on
GitHub, free, and based on the MIT license with no form of payment!

If you find this project helpful, please give it a Star on GitHub, thank you!', "setBtSaveChat": "Save chat only", "setBtSaveSys": "Save to system", "wsrvClose": "Close wsrv", "wsrvOpen": "Open wsrv", "temperature": "Temperature", "temperatureInfo": "As the (temperature) value increases, the responses become more random", "top_p": "Top", "top_pInfo": "(top_p) is similar to randomness but should not be changed together with temperature", "presence_penalty": "Presence", "presence_penaltyInfo": "As the (presence_penalty) value increases, there is a higher chance of expanding to new topics", "frequency_penalty": "Frequency", "frequency_penaltyInfo": "As the (frequency_penalty) value increases, there is a higher likelihood of reducing repeated words", "tts_voice": "Voice Role", "typing": "Typing", "authErro": "Authorization failed", "authBt": "Please enter the authorization access password again" , "micWhisper": "Whisper speech recognition", "micAsr": "Instant recognition", "micRec": "Start recording, please speak! It will automatically stop if there is no sound for 2 seconds.", "micRecEnd": "Recording has ended" ,subtle: 'High definition 2x' ,creative: 'High definition 2x. Creative' ,gpt_gx: 'GPTs use g-*', "ideoabout": "About Ideogram", "ideoserver": "Ideogram Server", "ideokeyPlaceholder": "API Key for Ideogram (optional)", "ideopls": "Image description prompts", "nohead": "Excludes", klingabout: 'Kling About', klingserver: 'Kling API Address', klingkeyPlaceholder: 'Kling API Key (optional)', klingkey: 'Kling Key', mode: 'Mode', duration: 'Duration', negative_prompt: 'Place text without objects here', std: 'High Performance', pro: 'High Quality', needImg: 'Please upload a reference image for it to take effect!', seed: 'Seed number 1~2147483647', klingInfo: 'Description:

  • 1. High Quality is 3.5 times the price
  • 2. 10s is 2 times the price
  • 3. The last frame must have a reference image to take effect
  • ' ,"camera_type": "Lens", "cnull": "Smart Matching", "down_back": "Move Down and Zoom Out", "forward_up": "Push Forward and Move Up", "right_turn_forward": "Turn Right and Push Forward", "left_turn_forward": "Turn Left and Push Forward" ,kling:'Kling' ,rttab: 'RealTime', rtinfo: 'Realtime voice conversation service', rtsetting: 'Please set the server. Currently, Realtime only supports remote services; for local services, please contact the author.', rjcloded: 'Connection has been disconnected', checkkey: 'Please check if the API key is correct', rtsuccess: 'Connection is normal, maintaining the call', rtservererror: 'WebSocket connection server error!', rtservererror2: 'Recording is not supported, it may be due to device reasons!', rtconecting: 'Connecting to the server' ,confirmDelete:'Are you sure?', pikaabout: 'About Pika', pikaserver: 'Pika API Address', pikakeyPlaceholder: 'Pika API Key (optional)', createFail: 'Creation failed', selecteff: 'Reference Effect', "udioabout": "About Udio", "udiokeyPlaceholder": "Udio API Key (optional)", "udioserver": "Udio API Address", "ud_prompt": "Prompt", "ud_prompt_pls": "Prompt: Description, Style", "ud_ly_write": "Write-Lyrics", "ud_ly_auto": "Auto", "ud_ly_null": "Instrumental", "ud_v32": "Affordable", "ud_v130": "Long Duration", "ud_info": "Note:
    • 1. Udio-32 has a short duration
    • 2. Udio-130 is twice the price of Udio-32
    • 3. The prompt can include style, description, etc.
    ", "ud_fail": "Failed to generate this song!", "ud_doing": "Cannot play while generating", "ud_continuation": "Continuation", "ud_precede": "Preced", "upImg2": 'Upload Image
    This model supports image recognition
    Note: There will be additional image fees
    Formats: jpeg jpg png gif

    Supports drag and drop

    Upload MP3 MP4
    Will automatically call the whisper-1 model
    Formats include: mp3 mp4 mpeg mpga m4a wav webm

    ', "rml_info": "Note:
    • 1. Must include an image
    • 2. The model only has one gen3a_turbo
    • 3. The price for 10s is double that of 5s
    ", "rml_heng": "Landscape", "rml_shu": "Portrait", "pixabout": "Pixverse related", "pixkeyPlaceholder": "Pixverse API Key can be left blank", "pixserver": "Pixverse API address", "pixinfo": " Description:
    • 1. Based on v3.5 360p duration 5s mode Normal
    • 2. v2.5 is 0.5 times
    • 3. Duration 10s is 2 times
    • 4. 540P is 1.5 times, 720P is 2 times, 1080P is 4 times
    • 5. Mode performance is 2 times
    • 6. The multiples are multiplied, for example, 720P duration 10s is 2*2 which is 4 times, and if performance is added, it becomes 8 times
    " ,server_load:'Server Pull' ,model_select:'Model Selecte' ,riffabout:'About Riffusion' ,riffkeyPlaceholder:'Riffusion API Key can be left blank' ,riffserver:'Riffusion API address' ,riffinfo:'Riffusion Description' ,editImage:'Image Edit' ,editVideo:'Image2Video' ,moreset:'More Parameters' }, "mjset": { "server": "Server", "about": "About", "model": "Model", "sysname": "AI Drawing" }, "mjtab": { "chat": "Chat", "draw": "Drawing", "drawinfo": "AI Drawing with Midjourney Engine", "gallery": "Gallery", "galleryInfo": "My Gallery" }, "mjchat": { "loading": "Loading Image", "openurl": "Open Link Directly", "failReason": "Failure Reason:", "reload": "Reload", "progress": "Progress:", "wait": "Task has been submitted, please wait...", "reroll": "Redraw", "wait2": "Task {id} has been submitted, please wait", "redrawEditing": "Partial Redraw Editing", "face": "Change Face", "blend": "Blend Images", "draw": "Drawing", "submiting": "Submitting", "submit": "Submit", "wait3": "Please do not close! Image is being generated...", "success": "Save Successful", "successTitle": "Success", "modlePlaceholder": "Custom models, separated by spaces (optional)", "myModle": "Custom Models", "historyCnt": "Context Count", "historyToken": "More context improves accuracy but consumes more credits", "historyTCnt": "Reply Count", "historyTCntInfo": "Higher reply count may consume more credits", "role": "Role Setting", "rolePlaceholder": "Set an exclusive role for your conversation (optional)", "loading2": "Loading...", "loadmore": "Load More", "nofind": "Unable to find", "nofind2": "related content. You can try the following:", "success2": "Switch Successful!", "modelChange": "Model Change", "search": "Search", "searchPlaceholder": "GPT names, descriptions", "attr": "Attachments", "noproduct": "Gallery has no entries yet", "myGallery": "My Gallery", "yourHead": "Your Avatar", "your2Head": "Celebrity Image", "tipInfo": "Note:
  • 1. Images must include faces for proper rendering
  • 2. 'Celebrity Image' can be created using MJ drawing
  • 3. 'Celebrity Image' can also include anime characters
  • 4. 'Your Avatar' is recommended to be a passport-sized personal photo
  • ", "placeInput": "Please fill in the prompt!", "more5sb": "Upload up to 5 images at most", "exSuccess": "Export successful... Please check the download folder", "downloadSave": "ai_drawing.txt", "noproducet": "No mature works for now", "imgBili": "Image Ratio", "imagEx": "Export Artwork Image Links", "prompt": "Prompts", "imgCYes": "Contains Base Image", "imgCUpload": "Upload Base Image", "imgCInfo": "Base Image Info:
    1. Use your own images as a base for MJ drawing
    2. You can use multiple base images, up to 5, each not exceeding 1M in size", "imgCadd": "+Add", "del": "Delete", "img2text": "Image-to-Text", "img2textinfo": "Not sure what prompts to use? Try Image-to-Text! Submit an image to get prompts", "traning": "Translating...", "imgcreate": "Generate Image", "imginfo": "Other parameters:
  • 1 --no: Ignore --no car to exclude cars from the image
  • 2 --seed: Obtain a seed first with --seed 123456
  • 3 --chaos 10: Mix (range: 0-100)
  • 4 --tile: Fragmentation
  • ", "tStyle": "Style", "tView": "View", "tShot": "Character Shot", "tLight": "Lighting", "tQuality": "Image Quality", "tStyles": "Artistic Level", "tVersion": "Model Version", "dalleInfo": "Note:
  • 1. DALL-E is an image generation model provided by OpenAI
  • 2. OpenAI images have an expiration date, so make backups
  • 3. Note: The price of 1790px images is double
  • ", "version": "Version", "size": "Size", "blendInfo": "Note:
  • 1. Blend at least 2 images
  • 2. Up to 6 images can be used for blending
  • ", "blendStart": "Start Blending", "no2add": "Do not add duplicate images", "add2more": "Please add two or more images", "no1m": "Image size cannot exceed 1M", "imgExt": "Images support only jpg, gif, png, jpeg formats" ,"setSync": "Synchronize Midjourney and Suno" ,"addGPTS": "Add GPTs", "addPlaceholder": "Paste the GID of the GPTs here or directly paste the link of the GPTs", "gidError": "Valid GID not found, please fill in again", "success3": "GPTs added successfully!" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "Description", "custom": "Custom", "style": "Song Style", "stylepls": "Song Name, e.g., Pop Music", "emputy": "No content available", "noly": "No lyrics available", "inputly": "Please enter the song name or lyrics", "doingly": "In progress, please wait.", "doingly2": "Fetching lyrics...", "title": "Song Name", "titlepls": "Song Name, e.g., Vacation", "desc": "Song Description", "descpls": "Song description, e.g., Original pop music about vacation", "noneedly": "No lyrics needed", "rank": "Random selection", "ly": "Lyrics", "lypls": "Lyrics: with a certain format", "generate": "Compose Song", "generately": "Generate Lyrics", "nodata": "Please compose first to have a list of songs", "menu": "Music", "menuinfo": "Suno Music Creation", "server": "Suno API Endpoint", "serverabout": "Suno Related", "setOpenKeyPlaceholder": "Related KEY for Suno API; optional" ,upMps:'Upload' ,extend:'Extend' ,extendFrom:'Extend From' ,extendAt:'Extend at' ,fail:'Fail' ,info:'Note:
    Uploaded audio must be between 6 seconds and 60 seconds in duration.' } ,video: { menu: "Videos", menuinfo: "Luma and other video generate", descpls: "Video generate description", lumaabout: "About Luma", lumaserver: "Luma API endpoint", setOpenKeyPlaceholder: "Key for Luma API, optional", generate: "Generate video", nodata: "No available videos, please generate first!", selectimg: "Select image", clear: "Clear", plsInput: "Please input content!", submitSuccess: "Submitted successfully!", process: "Video generating...", repeat: "Get again", pending: 'Status: Queued', processing: 'Status: Processing', download: 'Download', extend: 'Extend', "lumainfo": "Explanation:
    • 1. Pro and relax demo videos have watermarked links.
    • 2. Pro without watermark requires obtaining the download link through the 'Download' button.
    • 3. The links for Pro versions are time-limited; please save the MP4 file locally promptly.
    • 4. For Pro versions, save the MP4 file locally within 30 minutes after generation, as the channel may be blocked or discontinued.
    • 5. If the download link for Pro versions is invalid, a watermarked video link will be provided.
    ", "runwayabout": "Runway Related", "runwayserver": "Runway API Endpoint", "setOpenKeyPlaceholder2": "Runway API key, optional", "endImg": "End Frame Image", "runwayinfo": "Explanation:
    • 1. Runway images and videos have expiration times.
    • 2. Please save the MP4 file locally within 30 minutes after generating the video.
    ", "nosup": "Not supported temporarily", "rwgen2": "Version: Gen-2, cost-effective", "rwgen3": "Version: Gen-3 Alpha", "repeat2":"Expired.Reget", rwgen3turbo:'Version: Gen-3 Alpha Turbo', gen3a_turbo_img:'Gen-3 Alpha Turbo must image', }, dance:{ menu: "Dance", menuinfo: "Create dance videos with Viggle and others.", character: "Character", viggleabout: "About Viggle", viggleserver: "Viggle API Endpoint", setOpenKeyPlaceholder: "Viggle API key, optional", info: "Instructions:
    1. Character images should preferably be full-body photos.
    2. Dance template videos should be personal videos, not group dances.", model: "Model", bgw: "White Background", bgg: "Green Background", bgmoban: "Original Background", bgrole: "Character Background", gring: "Generating...", uprolefirst: "Please upload character image first", uprolefail: "Upload failed", upvideo: "+ Upload Template Dance Video", usevideo: "+ Use Official Template", moban: "Dance Template", moban2: "Template Name", use: "Use" } } ================================================ FILE: src/locales/fr-FR.ts ================================================ export default { common: { add: 'Ajouter', addSuccess: 'Ajout réussi', edit: 'Éditer', editSuccess: 'Édition réussie', delete: 'Supprimer', deleteSuccess: 'Suppression réussie', save: 'Enregistrer', saveSuccess: 'Enregistrement réussi', reset: 'Réinitialiser', action: 'Action', export: 'Exporter', exportSuccess: 'Exportation réussie', import: 'Importer', importSuccess: 'Importation réussie', clear: 'Effacer', clearSuccess: 'Effacement réussi', yes: 'Oui', no: 'Non', confirm: 'Confirmer', download: 'Télécharger', noData: 'Pas de données', wrong: 'Quelque chose s\'est mal passé, veuillez réessayer plus tard.', success: 'Succès', failed: 'Échec', verify: 'Vérifier', unauthorizedTips: 'Non autorisé, veuillez vérifier d\'abord.', stopResponding: 'Arrêter de répondre', }, chat: { newChatButton: 'Nouveau Chat', //placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)', placeholder: 'Posez-moi n\'importe quoi, ou collez des captures d\'écran ou faites glisser le fichier. (Shift + Enter = saut de ligne, "/" pour déclencher des prompts)', placeholderMobile: 'Posez-moi n\'importe quoi...', copy: 'Copier', copied: 'Copié', copyCode: 'Copier le Code', clearChat: 'Effacer le Chat', clearChatConfirm: 'Êtes-vous sûr de vouloir effacer ce chat ?', exportImage: 'Exporter l\'Image', exportImageConfirm: 'Êtes-vous sûr de vouloir exporter ce chat en PNG ?', exportSuccess: 'Exportation réussie', exportFailed: 'Échec de l\'exportation', usingContext: 'Mode Contexte', turnOnContext: 'Dans le mode actuel, l\'envoi de messages conservera les enregistrements de chat précédents.', turnOffContext: 'Dans le mode actuel, l\'envoi de messages ne conservera pas les enregistrements de chat précédents.', deleteMessage: 'Supprimer le Message', deleteMessageConfirm: 'Êtes-vous sûr de vouloir supprimer ce message ?', deleteHistoryConfirm: 'Êtes-vous sûr de vouloir effacer cet historique ?', clearHistoryConfirm: 'Êtes-vous sûr de vouloir effacer l\'historique du chat ?', preview: 'Aperçu', showRawText: 'Afficher en texte brut', }, setting: { setting: 'Paramètres', general: 'Général', advanced: 'Avancé', config: 'Configuration', avatarLink: 'Lien de l\'Avatar', name: 'Nom', description: 'Description', backgroundImage: 'Image de Fond', role: 'Rôle', temperature: 'Température', top_p: 'Top_p', resetUserInfo: 'Réinitialiser les Infos Utilisateur', chatHistory: 'Historique du Chat', theme: 'Thème', language: 'Langue', webdavSync: 'Synchronisation WebDAV', webdavConfig: 'Configuration', webdavUrl: 'URL WebDAV', webdavUsername: 'Nom d\'utilisateur', webdavPassword: 'Mot de passe', webdavConfigError: 'Veuillez remplir la configuration WebDAV complète', webdavNotConfigured: 'Veuillez d\'abord configurer WebDAV', webdavSyncSuccess: 'Synchronisation réussie', webdavSyncError: 'Échec de la synchronisation', webdavTest: 'Tester la connexion', webdavUpload: 'Télécharger', webdavDownload: 'Télécharger', api: 'API', reverseProxy: 'Proxy Inverse', timeout: 'Délai d\'Attente', socks: 'Socks', httpsProxy: 'Proxy HTTPS', balance: 'Solde de l\'API', monthlyUsage: 'Utilisation Mensuelle', }, store: { siderButton: 'Prompt Boutique', local: 'Local', online: 'En ligne', title: 'Titre', description: 'Description', clearStoreConfirm: 'Voulez-vous vraiment effacer les données ?', importPlaceholder: 'Veuillez coller les données JSON ici', addRepeatTitleTips: 'Titre en double, veuillez le saisir à nouveau', addRepeatContentTips: 'Contenu en double : {msg}, veuillez le saisir à nouveau', editRepeatTitleTips: 'Conflit de titre, veuillez le réviser', editRepeatContentTips: 'Conflit de contenu {msg}, veuillez le modifier à nouveau', importError: 'Incompatibilité de valeur clé', importRepeatTitle: 'Titre ignoré de manière répétée : {msg}', importRepeatContent: 'Contenu ignoré de manière répétée : {msg}', onlineImportWarning: 'Remarque : Veuillez vérifier la source du fichier JSON !', downloadError: 'Veuillez vérifier l\'état du réseau et la validité du fichier JSON', }, "mj": { "setOpen": "Lié à OpenAI", "setOpenPlaceholder": "Doit inclure http(s)://", "setOpenUrl": "Adresse de l'API OpenAI", "setOpenKeyPlaceholder": "Utilisez une clé OpenAI personnalisée pour contourner les restrictions d'accès par mot de passe", "setMj": "Lié à Midjourney", "setMjUrl": "Adresse de l'API Midjourney:", "setMjKeyPlaceholder": "Utilisez une clé d'API Midjourney personnalisée pour contourner les restrictions d'accès par mot de passe", "setUploader": "Lié au Téléchargement", "setUploaderUrl": "Adresse de Téléchargement:", "setBtSave": "Enregistrer", "setBtBack": "Restaurer les Paramètres par Défaut", "redraw": "Redessiner", "fail1": "S'il vous plaît soyez patient, ça charge.", "success1": "Image rafraîchie avec succès !", "high_variation": "Variation Forte", "low_variation": "Variation Faible", "p15": "Zoom 1.5x", "p20": "Zoom 2x", "p100": "Normal", "retry": "Réessayer", "pan_left": "Gauche", "pan_right": "Droite", "pan_up": "Haut", "pan_down": "Bas", "up2": "HD 2x", "up4": "HD 4x" , "thinking": "Réflexion...", "noReUpload": "Impossible de réimporter", "uploading": "Téléchargement...", "uploadSuccess": "Téléchargement réussi", "uploadFail": "Échec du téléchargement:", "upPdf": "Téléchargez une image ou une pièce jointe
    Vous pouvez télécharger des images, des PDF, des EXCEL et d'autres documents

    Prise en charge du glisser-déposer

    ", "upImg": "Téléchargez une image
    Il invoquera automatiquement le modèle de prévisualisation gpt-4-vision
    Remarque : Des frais supplémentaires peuvent s'appliquer pour les images supplémentaires
    Formats : jpeg, jpg, png, gif

    Prise en charge du glisser-déposer

    Téléchargez MP3 MP4
    Il invoquera automatiquement le modèle whisper-1
    Formats : mp3, mp4, mpeg, mpga, m4a, wav, webm

    ", "clearAll": "Effacer les paramètres", "czoom": "Personnalisé", "customTitle": "Zoom personnalisé", "zoominfo": "Modifier la valeur du zoom, de 1.0 à 2.0, la valeur par défaut est réglée sur 1.8", "modleSuccess": "Modèle chargé avec succès", "setingSuccess": "Paramètres réussis", "tokenInfo1": "Jetons restants = Longueur du modèle - Réglage du rôle - Contexte (historique des conversations) - Nombre de réponses - Entrée actuelle", "tokenInfo2": "Laissez le réglage du rôle vide et le système fournira un réglage par défaut.", "noSuppertModel": "Actualiser, ce modèle n'est actuellement pas pris en charge !", "failOcr": "Échec de la reconnaissance", "remain": "Reste :", "totalUsage": "Montant total de l'abonnement", "disableGpt4": "GPT4 désactivé", "setTextInfo": "Erreur de clé API OpenAI, cliquez ici pour réessayer", "attr1": "Attribut", "ulink": "Lien de l'image", "copyFail": "Copie échouée", "tts": "Texte vers Parole", "fail": "Erreur", "noSupperChrom": "Navigateur non pris en charge !", "lang": "Voix", "ttsLoading": "Conversion en discours...", "ttsSuccess": "Conversion réussie", "micIng": "Enregistrement, dites quelque chose...", "mStart": "Démarrer", "mPause": "Pause", "mGoon": "Continuer", "mRecord": "Réenregistrer", "mPlay": "Lire", "mCanel": "Annuler", "mSent": "Envoyer", "findVersion": "Découvrir la version mise à jour", "yesLastVersion": "Déjà sur la dernière version", "infoStar": 'Ce projet est open source sur GitHub, gratuit et basé sur la licence MIT sans aucune forme de paiement !

    Si vous trouvez ce projet utile, veuillez lui donner une étoile sur GitHub, merci !', "setBtSaveChat": "Enregistrer le chat seulement", "setBtSaveSys": "Enregistrer dans le système", "wsrvClose": "Fermer wsrv", "wsrvOpen": "Ouvrir wsrv", "temperature": "Aléatoire", "temperatureInfo": "À mesure que la valeur de (temperature) augmente, les réponses deviennent plus aléatoires", "top_p": "Échantillonnage de probabilité supérieure", "top_pInfo": "(top_p) est similaire à l'aléatoire mais ne doit pas être modifié en même temps que la température", "presence_penalty": "Fraîcheur du sujet", "presence_penaltyInfo": "À mesure que la valeur de (presence_penalty) augmente, il y a plus de chances de s'étendre à de nouveaux sujets", "frequency_penalty": "Pénalité de fréquence", "frequency_penaltyInfo": "À mesure que la valeur de (frequency_penalty) augmente, il y a plus de chances de réduire les mots répétés" ,"tts_voice": "Personnage vocal TTS", "typing": "En train d'écrire", "authErro": "Échec de l'autorisation", "authBt": "Veuillez saisir à nouveau le mot de passe d'accès à l'autorisation", "micWhisper": "Reconnaissance vocale chuchotement", "micAsr": "Reconnaissance instantanée", "micRec": "Commencer l'enregistrement, s'il vous plaît parlez ! Il s'arrêtera automatiquement s'il n'y a pas de son pendant 2 secondes.", "micRecEnd": "L'enregistrement est terminé", subtle: 'Haute définition 2x' ,creative: 'Haute définition 2x. Créatif' ,gpt_gx: 'Les GPT utilisent g-*', "ideoabout": "À propos d'Ideogram", "ideoserver": "Serveur Ideogram", "ideokeyPlaceholder": "Clé API pour Ideogram (optionnelle)", "ideopls": "Invites de description d'image", "nohead": "Exclut", klingabout: 'Kling À propos', klingserver: 'Adresse API Kling', klingkeyPlaceholder: 'Clé API Kling (facultatif)', klingkey: 'Clé Kling', mode: 'Mode', duration: 'Durée', negative_prompt: 'Mettez le texte sans objets ici', std: 'Haute performance', pro: 'Haute qualité', needImg: 'Veuillez télécharger une image de référence pour qu’elle prenne effet !', seed: 'Numéro de graine 1~2147483647', klingInfo: 'Description :

  • 1. Haute qualité coûte 3,5 fois le prix
  • 2. 10 secondes coûtent 2 fois le prix
  • 3. La dernière image doit avoir une image de référence pour prendre effet
  • ' ,"camera_type": "Objectif", "cnull": "Correspondance intelligente", "down_back": "Descendre et zoomer", "forward_up": "Avancer et monter", "right_turn_forward": "Tourner à droite et avancer", "left_turn_forward": "Tourner à gauche et avancer" ,kling:'Kling' ,rttab: 'Voix', rtinfo: 'Service de conversation vocale en temps réel (realtime)', rtsetting: 'Veuillez configurer le serveur. Actuellement, Realtime ne prend en charge que les services à distance ; pour les services locaux, veuillez contacter l\'auteur.', rjcloded: 'La connexion a été déconnectée', checkkey: 'Veuillez vérifier si la clé API est correcte', rtsuccess: 'Connexion normale, maintien de l\'appel', rtservererror: 'Erreur de connexion au serveur WebSocket !', rtservererror2: 'Enregistrement non pris en charge, cela peut être dû à un problème de matériel !', rtconecting: 'Connexion au serveur en cours', "confirmDelete": "Êtes-vous sûr de vouloir supprimer ?", "pikaabout": "À propos de Pika", "pikaserver": "Adresse API Pika", "pikakeyPlaceholder": "Clé API Pika (facultatif)", "createFail": "Échec de la création", "selecteff": "Effet de référence", "udioabout": "À propos de Udio", "udiokeyPlaceholder": "Clé API Udio (optionnelle)", "udioserver": "Adresse API Udio", "ud_prompt": "Invite", "ud_prompt_pls": "Invite : Description, Style", "ud_ly_write": "Paroles personnalisées", "ud_ly_auto": "Paroles intelligentes", "ud_ly_null": "Musique pure", "ud_v32": "Abordable", "ud_v130": "Longue durée", "ud_info": "Remarque :
    • 1. Udio-32 a une durée courte
    • 2. Udio-130 coûte le double de Udio-32
    • 3. L'invite peut inclure style, description, etc.
    ", "ud_fail": "Échec de la génération de cette chanson !", "ud_doing": "Impossible de lire pendant la génération", "ud_continuation": "Continuation", "ud_precede": "Précédent", "upImg2": "Télécharger une image
    Ce modèle prend en charge la reconnaissance d'images
    Remarque : des frais supplémentaires pour les images seront appliqués
    Formats : jpeg jpg png gif

    Prend en charge le glisser-déposer

    Télécharger MP3 MP4
    Appellera automatiquement le modèle whisper-1
    Formats : mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "Remarque :
    • 1. Doit inclure une image
    • 2. Le modèle n'a qu'un seul gen3a_turbo
    • 3. Le prix pour 10 secondes est le double de celui de 5 secondes
    ", "rml_heng": "Paysage", "rml_shu": "Portrait", "pixabout": "Lié à Pixverse", "pixkeyPlaceholder": "La clé API de Pixverse peut être laissée vide", "pixserver": "Adresse de l'API Pixverse", "pixinfo": " Description :
    • 1. Basé sur v3.5 360p durée 5s mode Normal
    • 2. v2.5 est 0,5 fois
    • 3. Durée 10s est 2 fois
    • 4. 540P est 1,5 fois, 720P est 2 fois, 1080P est 4 fois
    • 5. Mode performance est 2 fois
    • 6. Les multiplicateurs se multiplient, par exemple, 720P durée 10s est 2*2 ce qui fait 4 fois, et si vous ajoutez performance, cela devient 8 fois
    ", "riffabout": "À propos de Riffusion", "riffkeyPlaceholder": "Clé API Riffusion (facultative)", "riffserver": "URL de l'API Riffusion", "riffinfo": "Description", "editImage": "Édition d'image", "editVideo": "Image vers vidéo", "moreset": "Paramètres supplémentaires", }, "mjset": { "server": "Serveur", "about": "À Propos", "model": "Modèle", "sysname": "Dessin AI" }, "mjtab": { "chat": "Chat", "draw": "Dessin", "drawinfo": "Dessin AI avec le Moteur Midjourney", "gallery": "Galerie", "galleryInfo": "Ma Galerie" }, "mjchat": { "loading": "Chargement de l'Image", "openurl": "Ouvrir le lien directement", "failReason": "Raison de l'échec:", "reload": "Recharger", "progress": "Progression:", "wait": "La tâche a été soumise, veuillez patienter...", "reroll": "Refaire", "wait2": "La tâche {id} a été soumise, veuillez patienter", "redrawEditing": "Édition partielle du Redraw", "face": "Changer de Visage", "blend": "Mélanger les Images", "draw": "Dessin", "submiting": "Soumission", "submit": "Soumettre", "wait3": "Veuillez ne pas fermer! L'image est en cours de génération...", "success": "Enregistrement réussi", "successTitle": "Succès", "modlePlaceholder": "Modèles personnalisés, séparés par des espaces (facultatif)", "myModle": "Modèles Personnalisés", "historyCnt": "Nombre de Contextes", "historyToken": "Plus de contexte améliore la précision mais consomme plus de crédits", "historyTCnt": "Nombre de Réponses", "historyTCntInfo": "Un nombre plus élevé de réponses peut consommer plus de crédits", "role": "Paramètre de Rôle", "rolePlaceholder": "Définissez un rôle exclusif pour votre conversation (facultatif)", "loading2": "Chargement...", "loadmore": "Charger Plus", "nofind": "Impossible de trouver", "nofind2": "contenu connexe. Vous pouvez essayer ce qui suit:", "success2": "Changement réussi!", "modelChange": "Changement de Modèle", "search": "Rechercher", "searchPlaceholder": "Noms GPT, descriptions", "attr": "Pièces Jointes", "noproduct": "La galerie n'a pas encore d'entrées", "myGallery": "Ma Galerie", "yourHead": "Votre Avatar", "your2Head": "Image de Célébrité", "tipInfo": "Note:
  • 1. Les images doivent inclure des visages pour un rendu correct
  • 2. L'«Image de Célébrité» peut être créée en utilisant le dessin MJ
  • 3. L'«Image de Célébrité» peut également inclure des personnages d'anime
  • 4. «Votre Avatar» est recommandé d'être une photo personnelle de la taille d'un passeport
  • ", "placeInput": "Veuillez remplir la demande!", "more5sb": "Téléchargez jusqu'à 5 images au maximum", "exSuccess": "Exportation réussie... Veuillez vérifier le dossier de téléchargement", "downloadSave": "ai_drawing.txt", "noproducet": "Pas encore d'œuvres matures pour le moment", "imgBili": "Ratio d'Image", "imagEx": "Exporter les Liens d'Œuvres d'Art", "prompt": "Prompts", "imgCYes": "Contient une Image de Base", "imgCUpload": "Télécharger une Image de Base", "imgCInfo": "Informations sur l'Image de Base:
    1. Utilisez vos propres images comme base pour le dessin MJ
    2. Vous pouvez utiliser plusieurs images de base, jusqu'à 5, chacune ne dépassant pas 1 Mo", "imgCadd": "+Ajouter", "del": "Supprimer", "img2text": "Image-to-Text", "img2textinfo": "Vous ne savez pas quels prompts utiliser? Essayez Image-to-Text! Soumettez une image pour obtenir des prompts", "traning": "Traduction...", "imgcreate": "Générer une Image", "imginfo": "Autres paramètres:
  • 1 --no: Ignorer --no car pour exclure les voitures de l'image
  • 2 --seed: Obtenir d'abord une graine avec --seed 123456
  • 3 --chaos 10: Mélanger (plage: 0-100)
  • 4 --tile: Fragmentation
  • ", "tStyle": "Style", "tView": "Vue", "tShot": "Prise de Personnage", "tLight": "Éclairage", "tQuality": "Qualité de l'Image", "tStyles": "Niveau Artistique", "tVersion": "Version du Modèle", "dalleInfo": "Note:
  • 1. DALL-E est un modèle de génération d'images fourni par OpenAI
  • 2. Les images OpenAI ont une date d'expiration, alors faites des sauvegardes
  • 3. Remarque: Le prix des images de 1790 px est doublé
  • ", "version": "Version", "size": "Taille", "blendInfo": "Note:
  • 1. Mélanger au moins 2 images
  • 2. Jusqu'à 6 images peuvent être utilisées pour le mélange
  • ", "blendStart": "Commencer à Mélanger", "no2add": "Ne pas ajouter d'images en double", "add2more": "Veuillez ajouter deux images ou plus", "no1m": "La taille de l'image ne peut pas dépasser 1 Mo", "imgExt": "Les images ne supportent que les formats jpg, gif, png, jpeg", "setSync": "Synchroniser Midjourney et Suno", "addGPTS": "Ajouter des GPTs", "addPlaceholder": "Collez le GID des GPTs ici ou collez directement le lien des GPTs", "gidError": "GID valide introuvable, veuillez remplir à nouveau", "success3": "GPTs ajoutés avec succès !" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "Mode de description", "custom": "Mode professionnel", "style": "Style de chanson", "stylepls": "Nom de la chanson, par exemple : Musique pop", "emputy": "Aucun contenu disponible", "noly": "Pas de paroles disponibles", "inputly": "Veuillez saisir le nom de la chanson ou les paroles", "doingly": "En cours, veuillez patienter.", "doingly2": "Récupération des paroles...", "title": "Nom de la chanson", "titlepls": "Nom de la chanson, par exemple : Vacances", "desc": "Description de la chanson", "descpls": "Description de la chanson, par exemple : Musique pop originale sur les vacances", "noneedly": "Pas besoin de paroles", "rank": "Sélection aléatoire", "ly": "Paroles", "lypls": "Paroles : avec un certain format", "generate": "Composer une chanson", "generately": "Générer des paroles", "nodata": "Veuillez composer d'abord pour obtenir une liste de chansons", "menu": "Musique", "menuinfo": "Création musicale Suno", "server": "Point de terminaison de l'API Suno", "serverabout": "Lié à Suno", "setOpenKeyPlaceholder": "Clé associée pour l'API Suno ; facultatif", upMps: 'Télécharger l\'audio', extend: 'Étendre', extendFrom: 'Étendre depuis', extendAt: 'Commencer l\'extension à', fail: 'Échec', info: 'Instructions :
    La durée de l\'audio téléchargé doit être comprise entre 6s et 60s' } ,video:{ "menu": "Vidéos", "menuinfo": "Création de vidéos Luma et autres", "descpls": "Description de création de vidéos", "lumaabout": "À propos de Luma", "lumaserver": "Adresse de l'API Luma", "setOpenKeyPlaceholder": "Clé API Luma, facultatif", "generate": "Générer la vidéo", "nodata": "Aucune vidéo disponible, veuillez d'abord générer !", "selectimg": "Sélectionner une image", "clear": "Effacer", "plsInput": "Veuillez saisir du contenu !", "submitSuccess": "Soumis avec succès !", "process": "Génération de la vidéo...", "repeat": "Réessayer", "lumainfo": "Explication :
    • 1. Les vidéos de démonstration Pro et relax ont des liens avec des filigranes.
    • 2. La version Pro sans filigrane nécessite d'obtenir le lien de téléchargement via le bouton 'Télécharger'.
    • 3. Les liens pour les versions Pro sont limités dans le temps ; veuillez sauvegarder le fichier MP4 localement dès que possible.
    • 4. Pour les versions Pro, sauvegardez le fichier MP4 localement dans les 30 minutes suivant la génération, car le canal peut être bloqué ou arrêté.
    • 5. Si le lien de téléchargement pour les versions Pro est invalide, un lien vidéo avec filigrane sera fourni.
    ", "runwayabout": "Lié à Runway", "runwayserver": "Adresse de l'API Runway", "setOpenKeyPlaceholder2": "Clé API Runway, facultative", "endImg": "Image de fin", "runwayinfo": "Explication :
    • 1. Les images et vidéos de Runway ont une durée de validité.
    • 2. Veuillez sauvegarder le fichier MP4 localement dans les 30 minutes suivant la génération de la vidéo.
    ", "nosup": "Non pris en charge temporairement", "rwgen2": "Version : Gen-2, rentable", "rwgen3": "Version : Gen-3 Alpha", "repeat2":"Expired.Reget" }, dance:{ menu: "Danse", menuinfo: "Créez des vidéos de danse avec Viggle et d'autres.", character: "Personnage", viggleabout: "À propos de Viggle", viggleserver: "Adresse API Viggle", setOpenKeyPlaceholder: "Clé API Viggle, facultatif", info: "Instructions :
    1. Les images de personnage devraient de préférence être des photos en pied.
    2. Les vidéos de modèles de danse devraient être des vidéos personnelles, pas des danses de groupe.", model: "Modèle", bgw: "Arrière-plan blanc", bgg: "Arrière-plan vert", bgmoban: "Arrière-plan du modèle", bgrole: "Arrière-plan du personnage", gring: "En cours de génération...", uprolefirst: "Veuillez d'abord télécharger l'image du personnage", uprolefail: "Échec du téléchargement", upvideo: "+ Télécharger la vidéo de modèle de danse", usevideo: "+ Utiliser le modèle officiel", moban: "Modèle de danse", moban2: "Nom du modèle", use: "Utiliser" } } ================================================ FILE: src/locales/index.ts ================================================ import type { App } from 'vue' import { createI18n } from 'vue-i18n' import enUS from './en-US' import koKR from './ko-KR' import zhCN from './zh-CN' import zhTW from './zh-TW' import ruRU from './ru-RU' import viVn from './vi-VN' import frFr from './fr-FR' import trTr from './tr-TR' import { useAppStoreWithOut } from '@/store/modules/app' import type { Language } from '@/store/modules/app/helper' const appStore = useAppStoreWithOut() const defaultLocale = appStore.language || 'zh-CN' const i18n = createI18n({ locale: defaultLocale, fallbackLocale: 'en-US', allowComposition: true, messages: { 'en-US': enUS, 'ko-KR': koKR, 'zh-CN': zhCN, 'zh-TW': zhTW, 'ru-RU': ruRU, 'vi-VN': viVn, 'fr-FR': frFr, 'tr-TR': trTr, }, }) export const t = i18n.global.t export function setLocale(locale: Language) { i18n.global.locale = locale } export function setupI18n(app: App) { app.use(i18n) } export default i18n ================================================ FILE: src/locales/ko-KR.ts ================================================ export default { common: { add: '추가', addSuccess: '추가 성공', edit: '편집', editSuccess: '편집 성공', delete: '삭제', deleteSuccess: '삭제 성공', save: '저장', saveSuccess: '저장 성공', reset: '초기화', action: '액션', export: '내보내기', exportSuccess: '내보내기 성공', import: '가져오기', importSuccess: '가져오기 성공', clear: '비우기', clearSuccess: '비우기 성공', yes: '예', no: '아니오', confirm: '확인', download: '다운로드', noData: '데이터 없음', wrong: '문제가 발생했습니다. 나중에 다시 시도하십시오.', success: '성공', failed: '실패', verify: '검증', unauthorizedTips: '인증되지 않았습니다. 먼저 확인하십시오.', stopResponding: '응답 중지', }, chat: { newChatButton: '새로운 채팅', //placeholder: '무엇이든 물어보세요...(Shift + Enter = 줄바꿈, "/"를 눌러서 힌트를 보세요)', placeholder: '할 말을 입력하거나 스크린샷을 붙여넣거나 파일을 드래그 앤 드롭할 수 있습니다.', placeholderMobile: '무엇이든 물어보세요...', copy: '복사', copied: '복사됨', copyCode: '코드 복사', clearChat: '채팅 비우기', clearChatConfirm: '이 채팅을 비우시겠습니까?', exportImage: '이미지 내보내기', exportImageConfirm: '이 채팅을 png로 내보내시겠습니까?', exportSuccess: '내보내기 성공', exportFailed: '내보내기 실패', usingContext: '컨텍스트 모드', turnOnContext: '현재 모드에서는 이전 대화 기록을 포함하여 메시지를 보낼 수 있습니다.', turnOffContext: '현재 모드에서는 이전 대화 기록을 포함하지 않고 메시지를 보낼 수 있습니다.', deleteMessage: '메시지 삭제', deleteMessageConfirm: '이 메시지를 삭제하시겠습니까?', deleteHistoryConfirm: '이 기록을 삭제하시겠습니까?', clearHistoryConfirm: '채팅 기록을 삭제하시겠습니까?', preview: '미리보기', showRawText: '원본 텍스트로 보기', }, setting: { setting: '설정', general: '일반', advanced: '고급', config: '설정', avatarLink: '아바타 링크', name: '이름', description: '설명', backgroundImage: '배경 이미지', role: '역할', temperature: '온도', top_p: 'Top_p', resetUserInfo: '사용자 정보 초기화', chatHistory: '채팅 기록', theme: '테마', language: '언어', webdavSync: 'WebDAV 동기화', webdavConfig: '구성', webdavUrl: 'WebDAV 주소', webdavUsername: '사용자 이름', webdavPassword: '비밀번호', webdavConfigError: '완전한 WebDAV 구성을 입력하세요', webdavNotConfigured: '먼저 WebDAV를 구성하세요', webdavSyncSuccess: '동기화 성공', webdavSyncError: '동기화 실패', webdavTest: '연결 테스트', webdavUpload: '업로드', webdavDownload: '다운로드', api: 'API', reverseProxy: '리버스 프록시', timeout: '타임아웃', socks: 'Socks', httpsProxy: 'HTTPS 프록시', balance: 'API 잔액', monthlyUsage: '월 사용량', }, store: { siderButton: '프롬프트 저장소', local: '로컬', online: '온라인', title: '제목', description: '설명', clearStoreConfirm: '데이터를 삭제하시겠습니까?', importPlaceholder: '여기에 JSON 데이터를 붙여넣으십시오', addRepeatTitleTips: '제목 중복됨, 다시 입력하십시오', addRepeatContentTips: '내용 중복됨: {msg}, 다시 입력하십시오', editRepeatTitleTips: '제목 충돌, 수정하십시오', editRepeatContentTips: '내용 충돌 {msg} , 수정하십시오', importError: '키 값 불일치', importRepeatTitle: '제목이 반복되어 건너뜀: {msg}', importRepeatContent: '내용이 반복되어 건너뜀: {msg}', onlineImportWarning: '참고: JSON 파일 소스를 확인하십시오!', }, "mj": { "setOpen": "OpenAI 관련", "setOpenPlaceholder": "http(s)://를 포함해야 함" ,"setOpenUrl": "OpenAI 인터페이스 주소" ,"setOpenKeyPlaceholder": "비밀번호 액세스 제한을 우회하기 위해 사용자 지정 OpenAI 키 사용" ,"setMj": "Midjourney 관련" ,"setMjUrl": "Midjourney 인터페이스 주소:" ,"setMjKeyPlaceholder": "비밀번호 액세스 제한을 우회하기 위해 사용자 지정 Api Secret 사용" ,"setUploader": "업로드 관련" ,"setUploaderUrl": "업로드 주소:" ,"setBtSave": "저장" ,"setBtBack": "기본으로 복원", "redraw": "부분 재그림", "fail1": "고객님은 너무 급해하지 마세요. 로딩 중입니다.", "success1": "이미지가 성공적으로 새로고쳐졌습니다!", "high_variation": "강한 변화", "low_variation": "약한 변화", "p15": "확대 1.5배", "p20": "확대 2배", "p100": "표준", "retry": "분석 다시 시도", "pan_left": "왼쪽으로 다시 분석", "pan_right": "오른쪽으로 다시 분석", "pan_up": "위로 다시 분석", "pan_down": "아래로 다시 분석", "up2": "고화질 2배", "up4": "고화질 4배" , "thinking": "생각 중...", "noReUpload": "다시 업로드할 수 없습니다", "uploading": "업로딩 중...", "uploadSuccess": "업로드 성공", "uploadFail": "업로드 실패:", "upPdf": "이미지 또는 첨부 파일 업로드
    이미지, PDF, EXCEL 및 기타 문서를 업로드할 수 있습니다

    드래그 앤 드롭 지원

    ", "upImg": "이미지 업로드
    자동으로 gpt-4-vision-preview 모델을 호출합니다
    참고: 추가 이미지 비용이 발생할 수 있습니다
    포맷: jpeg, jpg, png, gif

    드래그 앤 드롭 지원

    MP3 MP4 업로드
    자동으로 whisper-1 모델을 호출합니다
    포맷: mp3, mp4, mpeg, mpga, m4a, wav, webm

    ", "clearAll": "매개변수 지우기", "czoom": "사용자 정의", "customTitle": "사용자 정의 줌", "zoominfo": "줌 값 수정, 범위는 1.0에서 2.0까지이며 기본 설정은 1.8로 설정됩니다", "modleSuccess": "모델이 성공적으로 로드되었습니다", "setingSuccess": "설정이 성공적으로 완료되었습니다", "tokenInfo1": "남은 토큰 = 모델 길이 - 역할 설정 - 컨텍스트 (대화 기록) - 답변 수 - 현재 입력", "tokenInfo2": "역할 설정을 비워두면 시스템에서 기본 값을 제공합니다.", "noSuppertModel": "새로 고침, 현재 이 모델은 지원되지 않습니다!", "failOcr": "인식 실패", "remain": "남:", "totalUsage": "총 구독 금액", "disableGpt4": "GPT4 비활성화됨", "setTextInfo": "OpenAI API 키 오류, 여기를 클릭하여 다시 시도", "attr1": "첨부", "ulink": "원본 이미지 링크", "copyFail": "복사 실패", "tts": "텍스트 음성 변환 (TTS)", "fail": "오류가 발생했습니다", "noSupperChrom": "브라우저가 지원되지 않습니다!", "lang": "음성", "ttsLoading": "음성으로 변환 중...", "ttsSuccess": "변환 성공", "micIng": "녹음 중, 무엇인가 말해보세요...", "mStart": "시작", "mPause": "일시 정지", "mGoon": "계속", "mRecord": "다시 녹음", "mPlay": "재생", "mCanel": "취소", "mSent": "전송", "findVersion": "최신 버전 찾기", "yesLastVersion": "최신 버전입니다", "infoStar": "이 프로젝트는 GitHub에서 오픈 소스로 제공되며 MIT 라이선스를 기반으로 하며 어떠한 유료 행위도 없습니다!

    이 프로젝트가 도움이 되었다면 GitHub에서 별을 주시기 바랍니다. 감사합니다!", "setBtSaveChat": "대화만 저장", "setBtSaveSys": "시스템에 저장", "wsrvClose": "닫기 wsrv", "wsrvOpen": "열기 wsrv", "temperature": "랜덤성", "temperatureInfo": "(temperature) 값이 증가함에 따라 응답이 더 랜덤해집니다", "top_p": "상위 확률 샘플링", "top_pInfo": "(top_p)은 랜덤성과 유사하지만 온도와 함께 변경되어서는 안 됩니다", "presence_penalty": "주제 신선도", "presence_penaltyInfo": "(presence_penalty) 값이 증가함에 따라 새로운 주제로 확장될 가능성이 높아집니다", "frequency_penalty": "빈도 패널티", "frequency_penaltyInfo": "(frequency_penalty) 값이 증가함에 따라 반복된 단어를 줄이는 가능성이 높아집니다", "tts_voice": "TTS 음성 캐릭터", "typing": "입력 중", "authErro": "인가 실패", "authBt": "인가 액세스 암호를 다시 입력하십시오", "micWhisper": "속삭임 음성 인식", "micAsr": "즉시 인식", "micRec": "녹음 시작, 말씀하세요! 2초 동안 소리가 없으면 자동으로 중지됩니다.", "micRecEnd": "녹음이 종료되었습니다", subtle: '고화질 2배' ,creative: '고화질 2배. 창의적' ,gpt_gx: 'GPTs는 g-*를 사용합니다', "ideoabout": "아이디어그램에 대하여", "ideoserver": "아이디어그램 서버", "ideokeyPlaceholder": "아이디어그램의 API 키 (선택 사항)", "ideopls": "이미지 설명 프롬프트", "nohead": "포함하지 않음", klingabout: '클링 관련', klingserver: '클링 API 주소', klingkeyPlaceholder: '클링 API 키 (선택 사항)', klingkey: '클링 키', mode: '모드', duration: '지속 시간', negative_prompt: '여기에 객체가 없는 텍스트를 입력하세요', std: '고성능', pro: '고품질', needImg: '효과를 보려면 참조 이미지를 업로드하세요!', seed: '시드 번호 1~2147483647', klingInfo: '설명:

  • 1. 고품질은 가격의 3.5배입니다
  • 2. 10초는 가격의 2배입니다
  • 3. 마지막 프레임은 효과를 위해 참조 이미지가 필요합니다
  • ' ,"camera_type": "렌즈", "cnull": "스마트 매칭", "down_back": "아래로 이동하고 멀리하기", "forward_up": "앞으로 밀고 위로 이동하기", "right_turn_forward": "오른쪽으로 돌리고 앞으로 밀기", "left_turn_forward": "왼쪽으로 돌리고 앞으로 밀기" ,kling:'Kling', rttab: '음성', rtinfo: '실시간 음성 대화 서비스 (realtime)', rtsetting: '서버를 설정하십시오. 현재 Realtime은 원격 서비스만 지원합니다. 로컬 서비스가 필요하면 저자에게 문의하십시오.', rjcloded: '연결이 끊어졌습니다', checkkey: 'API 키가 올바른지 확인하십시오', rtsuccess: '연결이 정상이며 통화를 유지하고 있습니다', rtservererror: 'WebSocket 서버 연결 오류!', rtservererror2: '녹음이 지원되지 않습니다. 장치 문제일 수 있습니다!', rtconecting: '서버에 연결 중', "confirmDelete": "삭제하시겠습니까?", "pikaabout": "Pika 관련", "pikaserver": "Pika API 주소", "pikakeyPlaceholder": "Pika API 키 (선택 사항)", "createFail": "생성 실패", "selecteff": "참고 효과", "udioabout": "Udio에 대하여", "udiokeyPlaceholder": "Udio API 키 (선택 사항)", "udioserver": "Udio API 주소", "ud_prompt": "프롬프트", "ud_prompt_pls": "프롬프트: 설명, 스타일", "ud_ly_write": "사용자 정의 가사", "ud_ly_auto": "지능형 가사", "ud_ly_null": "순수 음악", "ud_v32": "저렴한", "ud_v130": "긴 시간", "ud_info": "주의:
    • 1. Udio-32는 짧은 길이를 가집니다
    • 2. Udio-130은 Udio-32의 2배 가격입니다
    • 3. 프롬프트에는 스타일, 설명 등을 포함할 수 있습니다
    ", "ud_fail": "이 곡 생성에 실패했습니다!", "ud_doing": "생성 중에는 재생할 수 없습니다", "ud_continuation": "계속", "ud_precede": "이전", "upImg2": "이미지 업로드
    이 모델은 이미지 인식을 지원합니다
    주의: 추가 이미지 요금이 발생합니다
    형식: jpeg jpg png gif

    드래그 앤 드롭 지원

    MP3 MP4 업로드
    자동으로 whisper-1 모델을 호출합니다
    형식: mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "주의:
    • 1. 반드시 이미지를 포함해야 합니다
    • 2. 모델은 gen3a_turbo 하나만 있습니다
    • 3. 10초 가격은 5초의 두 배입니다
    ", "rml_heng": "가로 모드", "rml_shu": "세로 모드", "pixabout": "Pixverse 관련", "pixkeyPlaceholder": "Pixverse API 키는 비워둘 수 있습니다", "pixserver": "Pixverse API 주소", "pixinfo": " 설명:
    • 1. v3.5 360p 지속시간 5초 모드 Normal을 기준으로 함
    • 2. v2.5는 0.5배입니다
    • 3. 지속시간 10초는 2배입니다
    • 4. 540P는 1.5배, 720P는 2배, 1080P는 4배입니다
    • 5. 성능 모드는 2배입니다
    • 6. 배수는 곱해지며, 예를 들어 720P 지속시간 10초는 2*2로 4배가 되고, 성능을 추가하면 8배가 됩니다
    ", "riffabout": "Riffusion 관련", "riffkeyPlaceholder": "Riffusion API 키 (선택 사항)", "riffserver": "Riffusion API 주소", "riffinfo": "설명", "editImage": "이미지 편집", "editVideo": "이미지에서 비디오 생성", "moreset": "추가 설정", }, "mjset": { "server": "서버" ,"about": "소개" ,"model": "모델" ,"sysname": "AI 그림" }, "mjtab": { "chat": "대화" ,"draw": "그림" ,"drawinfo": "AI 그림 Midjourney 엔진" ,"gallery": "갤러리" ,"galleryInfo": "내 갤러리" }, "mjchat": { "loading": "이미지 로드 중" ,"openurl": "직접 링크 열기" ,"failReason": "실패 이유:" ,"reload": "재로드" ,"progress": "진행:" ,"wait": "작업이 제출되었습니다. 기다려주세요..." ,"reroll": "재그림" ,"wait2": "작업 {id}이(가) 제출되었습니다. 기다려주세요" ,"redrawEditing": "일부 재그림 편집" ,"face": "얼굴 바꾸기" ,"blend": "혼합" ,"draw": "그림 그리기" ,"submiting": "제출 중" ,"submit": "제출" ,"wait3": "닫지 마세요! 이미지 생성 중..." ,"success": "저장 성공" ,"successTitle": "성공" ,"modlePlaceholder": "여러 개의 사용자 정의 모델은 띄어쓰기로 구분됩니다. 필수 사항은 아닙니다." ,"myModle": "내 모델" ,"historyCnt": "컨텍스트 수" ,"historyToken": "더 많은 컨텍스트는 기억을 더 정확하게 만들지만 더 많은 크레딧을 소비할 수 있습니다." ,"historyTCnt": "답장 수" ,"historyTCntInfo": "답장 수가 많을수록 더 많은 크레딧이 소비될 수 있습니다." ,"role": "역할 설정" ,"rolePlaceholder": "대화에 고유한 역할을 설정하십시오. 필수는 아닙니다." ,"loading2": "로딩 중..." ,"loadmore": "더 보기" ,"nofind": "찾을 수 없음" ,"nofind2": "관련 내용을 찾을 수 없습니다. 다음을 시도해 보십시오." ,"success2": "전환 성공!" ,"modelChange": "모델 변경" ,"search": "검색" ,"searchPlaceholder": "GPTs 이름, 소개" ,"attr": "첨부 파일" ,"noproduct": "갤러리에 작품이 없습니다." ,"myGallery": "내 갤러리" ,"yourHead": "당신의 프로필 사진" ,"your2Head": "스타 이미지" ,"tipInfo": "설명:
  • 1. 이미지에는 얼굴이 반드시 포함되어야 합니다. 그렇지 않으면 이미지가 생성되지 않습니다.
  • 2. '스타 이미지'는 먼저 MJ 그림으로 만들 수 있습니다.
  • 3. '스타 이미지'는 애니메이션 이미지로도 괜찮습니다.
  • 4. '당신의 프로필 사진'은 1인치 개인 사진을 사용하는 것이 좋습니다.
  • " ,"placeInput": "힌트를 입력하세요!" ,"more5sb": "최대 5장의 이미지를 업로드할 수 있습니다." ,"exSuccess": "내보내기 성공... 다운로드 창을 확인하세요." ,"downloadSave": "ai그림.txt" ,"noproducet": "아직 미완성 작품이 없습니다." ,"imgBili": "이미지 비율" ,"imagEx": "작품 이미지 링크 내보내기" ,"prompt": "힌트" ,"imgCYes": "쿠션 이미지 포함" ,"imgCUpload": "자체 쿠션 이미지 업로드" ,"imgCInfo": "쿠션 이미지 안내:
    1. 쿠션 이미지는 자체 이미지를 기본으로 사용하여 MJ로 그림을 그릴 수 있습니다.
    2. 최대 5 장의 쿠션 이미지를 사용할 수 있으며 각 이미지의 크기는 1M를 초과하지 않아야 합니다.
    " ,"imgCadd": "+추가" ,"del": "삭제" ,"img2text": "이미지에서 텍스트 생성" ,"img2textinfo": "힌트가 어떻게 쓰여야 할지 모르겠나요? 이미지에서 텍스트를 생성해 보세요!
    이미지를 제출하면 힌트가 생성됩니다." ,"traning": "번역 중..." ,"imgcreate": "이미지 생성" ,"imginfo": "기타 매개변수:
  • 1 --no를 무시하면 --no car가 이미지에 표시되지 않습니다.
  • 2 --seed는 먼저 시드를 얻을 수 있습니다. --seed 123456
  • 3 --chaos 10은 혼합(범위: 0-100)
  • 4 --tile 조각화
  • " ,"tStyle": "스타일" ,"tView": "시점" ,"tShot": "캐릭터 샷" ,"tLight": "조명" ,"tQuality": "화질" ,"tStyles": "아트 정도" ,"tVersion": "모델 버전" ,"dalleInfo": "설명:
  • 1. DALL-E는 OpenAI에서 제공하는 그림 모델입니다.
  • 2. OpenAI의 이미지는 일시적입니다. 백업을 잘 해 두세요.
  • 3. 주의: 1790px 이미지의 가격은 두 배입니다.
  • " ,"version": "버전" ,"size": "크기" ,"blendInfo": "설명:
  • 1. 최소 2 장의 이미지를 합성하십시오.
  • 2. 최대 6 장의 이미지를 업로드할 수 있습니다.
  • " ,"blendStart": "합성 시작" ,"no2add": "이미지를 중복해서 추가하지 마십시오." ,"add2more": "두 장 이상의 이미지를 추가하십시오." ,"no1m": "이미지 크기는 1M를 초과할 수 없습니다." ,"setSync": "Midjourney와 Suno를 동기화하십시오" ,"imgExt": "이미지는 jpg, gif, png, jpeg 형식만 지원됩니다." ,"addGPTS": "GPTs 추가", "addPlaceholder": "여기에 GPTs의 GID를 붙이거나 GPTs의 링크를 직접 붙여 넣을 수 있습니다.", "gidError": "유효한 GID를 찾을 수 없습니다. 다시 작성해주세요.", "success3": "GPTs 추가 성공!" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "설명 모드", "custom": "전문가 모드", "style": "노래 스타일", "stylepls": "노래 이름, 예: 팝 음악", "emputy": "내용 없음", "noly": "가사 없음", "inputly": "노래 이름 또는 가사를 입력하세요", "doingly": "진행 중입니다. 잠시 기다려주세요.", "doingly2": "가사 가져오는 중...", "title": "노래 제목", "titlepls": "노래 이름, 예: 휴가", "desc": "노래 설명", "descpls": "노래 설명, 예: 휴가에 관한 오리지널 팝 음악", "noneedly": "가사 필요 없음", "rank": "랜덤 선택", "ly": "가사", "lypls": "가사: 일정한 형식으로", "generate": "노래 만들기", "generately": "가사 생성", "nodata": "곡 목록을 보려면 먼저 곡을 작성하세요", "menu": "음악", "menuinfo": "Suno 음악 생성", "server": "Suno API 엔드포인트", "serverabout": "Suno 관련", "setOpenKeyPlaceholder": "Suno API에 대한 관련 키; 선택 사항", upMps: '오디오 업로드', extend: '확장', extendFrom: '출처', extendAt: '시작', fail: '실패', info: '설명:
    오디오 업로드 시간은 6초에서 60초 사이여야 합니다' } ,video:{ "menu": "비디오", "menuinfo": "Luma 및 다른 비디오 제작", "descpls": "비디오 제작 설명", "lumaabout": "Luma에 대해", "lumaserver": "Luma API 엔드포인트", "setOpenKeyPlaceholder": "Luma API 키, 선택 사항", "generate": "비디오 생성", "nodata": "사용할 수 있는 비디오가 없습니다. 먼저 생성하세요!", "selectimg": "이미지 선택", "clear": "지우기", "plsInput": "내용을 입력하세요!", "submitSuccess": "성공적으로 제출되었습니다!", "process": "비디오 생성 중...", "repeat": "재시도", "lumainfo": "설명:
    • 1. Pro 및 relax 데모 비디오는 워터마크가 있는 링크입니다.
    • 2. 워터마크 없는 Pro 버전은 '다운로드' 버튼을 통해 다운로드 링크를 받아야 합니다.
    • 3. Pro 버전 링크는 시간 제한이 있으며, MP4 파일을 로컬에 즉시 저장해야 합니다.
    • 4. Pro 버전은 생성 후 30분 이내에 MP4 파일을 로컬에 저장해야 하며, 채널이 차단되거나 중단될 수 있습니다.
    • 5. Pro 버전의 다운로드 링크가 무효일 경우 워터마크가 있는 비디오 링크가 제공됩니다.
    ", "runwayabout": "Runway 관련", "runwayserver": "Runway API 주소", "setOpenKeyPlaceholder2": "Runway API 키, 선택 사항", "endImg": "마지막 이미지", "runwayinfo": "설명:
    • 1. Runway 이미지 및 비디오는 유효 기간이 있습니다.
    • 2. 비디오 생성 후 30분 이내에 MP4 파일을 로컬에 저장해주세요.
    ", "nosup": "일시적으로 지원되지 않음", "rwgen2": "버전: Gen-2, 비용 효율적", "rwgen3": "버전: Gen-3 Alpha", "repeat2":"Expired.Reget" }, dance:{ menu: "댄스", menuinfo: "Viggle 및 기타와 함께 댄스 비디오 제작", character: "캐릭터", viggleabout: "Viggle 소개", viggleserver: "Viggle API 엔드포인트", setOpenKeyPlaceholder: "Viggle API 키, 선택 사항", info: "지침:
    1. 캐릭터 이미지는 전신 사진이 좋습니다.
    2. 댄스 템플릿 비디오는 개인 비디오여야 하며, 그룹 댄스가 아니어야 합니다.", model: "모델", bgw: "백색 배경", bgg: "초록색 배경", bgmoban: "템플릿 배경", bgrole: "캐릭터 배경", gring: "생성 중...", uprolefirst: "먼저 캐릭터 이미지를 업로드하세요", uprolefail: "업로드 실패", upvideo: "+ 템플릿 댄스 비디오 업로드", usevideo: "+ 공식 템플릿 사용", moban: "댄스 템플릿", moban2: "템플릿 이름", use: "사용" } } ================================================ FILE: src/locales/ru-RU.ts ================================================ export default { common: { add: 'Добавить', addSuccess: 'Добавлено успешно', edit: 'Редактировать', editSuccess: 'Изменено успешно', delete: 'Удалить', deleteSuccess: 'Удалено успешно', save: 'Сохранить', saveSuccess: 'Сохранено успешно', reset: 'Сбросить', action: 'Действие', export: 'Экспортировать', exportSuccess: 'Экспорт выполнен успешно', import: 'Импортировать', importSuccess: 'Импорт выполнен успешно', clear: 'Очистить', clearSuccess: 'Очищено успешно', yes: 'Да', no: 'Нет', confirm: 'Подтвердить', download: 'Загрузить', noData: 'Нет данных', wrong: 'Что-то пошло не так, пожалуйста, повторите попытку позже.', success: 'Успех', failed: 'Не удалось', verify: 'Проверить', unauthorizedTips: 'Не авторизован, сначала подтвердите свою личность.', stopResponding: 'Прекращение отклика', }, chat: { newChatButton: 'Новый чат', //placeholder: 'Спросите меня о чем-нибудь ... (Shift + Enter = перенос строки, "/" для вызова подсказок)', placeholder: 'Вы можете ввести что-то сказать, или вы можете вставить скриншоты или перетащить файлы.', placeholderMobile: 'Спросите меня о чем-нибудь ...', copy: 'Копировать', copied: 'Скопировано', copyCode: 'Копировать код', clearChat: 'Очистить чат', clearChatConfirm: 'Вы уверены, что хотите очистить этот чат?', exportImage: 'Экспорт в изображение', exportImageConfirm: 'Вы уверены, что хотите экспортировать этот чат в формате PNG?', exportSuccess: 'Экспортировано успешно', exportFailed: 'Не удалось выполнить экспорт', usingContext: 'Режим контекста', turnOnContext: 'В текущем режиме отправка сообщений будет включать предыдущие записи чата.', turnOffContext: 'В текущем режиме отправка сообщений не будет включать предыдущие записи чата.', deleteMessage: 'Удалить сообщение', deleteMessageConfirm: 'Вы уверены, что хотите удалить это сообщение?', deleteHistoryConfirm: 'Вы уверены, что хотите очистить эту историю?', clearHistoryConfirm: 'Вы уверены, что хотите очистить историю чата?', preview: 'Предварительный просмотр', showRawText: 'Показать как обычный текст', }, setting: { setting: 'Настройки', general: 'Общее', advanced: 'Дополнительно', config: 'Конфигурация', avatarLink: 'Ссылка на аватар', name: 'Имя', description: 'Описание', backgroundImage: 'Фоновое изображение', role: 'Роль', temperature: 'Температура', top_p: 'Top_p', resetUserInfo: 'Сбросить информацию о пользователе', chatHistory: 'История чата', theme: 'Тема', language: 'Язык', webdavSync: 'Синхронизация WebDAV', webdavConfig: 'Конфигурация', webdavUrl: 'URL WebDAV', webdavUsername: 'Имя пользователя', webdavPassword: 'Пароль', webdavConfigError: 'Пожалуйста, заполните полную конфигурацию WebDAV', webdavNotConfigured: 'Пожалуйста, сначала настройте WebDAV', webdavSyncSuccess: 'Синхронизация успешна', webdavSyncError: 'Ошибка синхронизации', webdavTest: 'Проверить соединение', webdavUpload: 'Загрузить', webdavDownload: 'Скачать', api: 'API', reverseProxy: 'Обратный прокси-сервер', timeout: 'Время ожидания', socks: 'Socks', httpsProxy: 'HTTPS-прокси', balance: 'Баланс API', monthlyUsage: 'Ежемесячное использование', }, store: { siderButton: 'Хранилище подсказок', local: 'Локальное', online: 'Онлайн', title: 'Название', description: 'Описание', clearStoreConfirm: 'Вы действительно хотите очистить данные?', importPlaceholder: 'Пожалуйста, вставьте здесь JSON-данные', addRepeatTitleTips: 'Дубликат названия, пожалуйста, введите другое название', addRepeatContentTips: 'Дубликат содержимого: {msg}, пожалуйста, введите другой текст', editRepeatTitleTips: 'Конфликт названий, пожалуйста, измените название', editRepeatContentTips: 'Конфликт содержимого {msg}, пожалуйста, измените текст', importError: 'Не совпадает ключ-значение', importRepeatTitle: 'Название повторяющееся, пропускается: {msg}', importRepeatContent: 'Содержание повторяющееся, пропускается: {msg}', onlineImportWarning: 'Внимание! Проверьте источник JSON-файла!', downloadError: 'Проверьте состояние сети и правильность JSON-файла', }, "mj": { "setOpen": "OpenAI связанный", "setOpenPlaceholder": "Должен содержать http(s)://", "setOpenUrl": "Адрес интерфейса OpenAI", "setOpenKeyPlaceholder": "Используйте свой собственный ключ OpenAI для обхода ограничений доступа по паролю", "setMj": "Midjourney связанный", "setMjUrl": "Адрес интерфейса Midjourney:", "setMjKeyPlaceholder": "Используйте свой собственный Api Secret для обхода ограничений доступа по паролю", "setUploader": "Связанный с загрузкой", "setUploaderUrl": "Адрес загрузки:", "setBtSave": "Сохранить", "setBtBack": "Восстановить по умолчанию", "redraw": "Частичная Перерисовка", "fail1": "Пожалуйста, будьте терпеливы, идет загрузка.", "success1": "Изображение успешно обновлено!", "high_variation": "Сильные Изменения", "low_variation": "Слабые Изменения", "p15": "Увеличение 1.5x", "p20": "Увеличение 2x", "p100": "Обычное", "retry": "Повторный Анализ", "pan_left": "Переанализировать влево", "pan_right": "Переанализировать вправо", "pan_up": "Переанализировать вверх", "pan_down": "Переанализировать вниз", "up2": "Высокое Разрешение 2x", "up4": "Высокое Разрешение 4x", "thinking": "В раздумьях...", "noReUpload": "Нельзя повторно загружать", "uploading": "Загрузка...", "uploadSuccess": "Загрузка успешна", "uploadFail": "Ошибка загрузки:", "upPdf": "Загрузите изображение или вложение
    Вы можете загрузить изображения, PDF, EXCEL и другие документы

    Поддерживается перетаскивание

    ", "upImg": "Загрузить изображение
    Автоматически вызовет модель gpt-4-vision-preview
    Примечание: Могут действовать дополнительные тарифы за изображения
    Форматы: jpeg, jpg, png, gif

    Поддерживается перетаскивание

    Загрузить MP3 MP4
    Автоматически вызовет модель whisper-1
    Форматы: mp3, mp4, mpeg, mpga, m4a, wav, webm

    ", "clearAll": "Очистить параметры", "czoom": "Настроить", "customTitle": "Настроить зум", "zoominfo": "Измените значение зума, диапазон от 1.0 до 2.0, по умолчанию установлено 1.8", "modleSuccess": "Модель успешно загружена", "setingSuccess": "Настройки успешно выполнены", "tokenInfo1": "Оставшиеся токены = Длина модели - Установка роли - Контекст (История разговора) - Количество ответов - Текущий ввод", "tokenInfo2": "Оставьте установку роли пустой, и система предоставит значение по умолчанию.", "noSuppertModel": "Обновите, эта модель в настоящее время не поддерживается!", "failOcr": "Ошибка распознавания", "remain": "Осталось:", "totalUsage": "Общая сумма подписки", "disableGpt4": "GPT4 отключен", "setTextInfo": "Ошибка ключа OpenAI API, нажмите здесь, чтобы повторить попытку", "attr1": "Вложение", "ulink": "Ссылка на оригинальное изображение", "copyFail": "Не удалось скопировать", "tts": "Текст в речь", "fail": "Произошла ошибка", "noSupperChrom": "Браузер не поддерживается!", "lang": "Голос", "ttsLoading": "Преобразование в речь...", "ttsSuccess": "Преобразование успешно", "micIng": "Идет запись, скажите что-нибудь...", "mStart": "Начать", "mPause": "Пауза", "mGoon": "Продолжить", "mRecord": "Перезаписать", "mPlay": "Воспроизвести", "mCanel": "Отмена", "mSent": "Отправить", "findVersion": "Обнаружить обновленную версию", "yesLastVersion": "Уже последняя версия", "infoStar": "Этот проект с открытым исходным кодом находится на GitHub, бесплатный и основан на лицензии MIT без каких-либо форм оплаты!

    Если вы находите этот проект полезным, пожалуйста, добавьте звезду на GitHub, спасибо!", "setBtSaveChat": "Сохранить только чат", "setBtSaveSys": "Сохранить в систему", "wsrvClose": "Закрыть wsrv", "wsrvOpen": "Открыть wsrv", "temperature": "Случайность", "temperatureInfo": "При увеличении значения (temperature) ответы становятся более случайными", "top_p": "Верхняя вероятность выборки", "top_pInfo": "(top_p) аналогично случайности, но не следует изменять вместе с температурой", "presence_penalty": "Свежесть темы", "presence_penaltyInfo": "При увеличении значения (presence_penalty) увеличивается вероятность расширения на новые темы", "frequency_penalty": "Частотное наказание", "frequency_penaltyInfo": "При увеличении значения (frequency_penalty) увеличивается вероятность уменьшения повторяющихся слов" ,"tts_voice": "Голос TTS", "typing": "Печать", "authErro": "Ошибка авторизации", "authBt": "Пожалуйста, введите пароль доступа к авторизации снова", "micWhisper": "Распознавание шепота", "micAsr": "Мгновенное распознавание", "micRec": "Начать запись, пожалуйста, говорите! Запись автоматически остановится, если 2 секунды не будет звука.", "micRecEnd": "Запись завершена", subtle: 'Высокое разрешение 2x' ,creative: 'Высокое разрешение 2x. Творческий' ,gpt_gx: 'GPT использует g-*', "ideoabout": "О Идеограмме", "ideoserver": "Сервер Идеограммы", "ideokeyPlaceholder": "API-ключ для Идеограммы (необязательно)", "ideopls": "Подсказки для описания изображения", "nohead": "Не включает", klingabout: 'Клинг О', klingserver: 'Адрес API Клинг', klingkeyPlaceholder: 'API-ключ Клинг (необязательно)', klingkey: 'Ключ Клинг', mode: 'Режим', duration: 'Продолжительность', negative_prompt: 'Поместите текст без объектов сюда', std: 'Высокая производительность', pro: 'Высокое качество', needImg: 'Пожалуйста, загрузите эталонное изображение, чтобы это заработало!', seed: 'Число семени 1~2147483647', klingInfo: 'Описание:

  • 1. Высокое качество стоит в 3.5 раза дороже
  • 2. 10 секунд стоит в 2 раза дороже
  • 3. Последний кадр должен иметь эталонное изображение для действия
  • ' ,"camera_type": "Объектив", "cnull": "Умное соответствие", "down_back": "Опустить и отдалить", "forward_up": "Продвинуть вперед и поднять", "right_turn_forward": "Повернуть вправо и продвинуться вперед", "left_turn_forward": "Повернуть влево и продвинуться вперед" ,kling:'Kling', rttab: 'Голос', rtinfo: 'Служба голосового общения в реальном времени (realtime)', rtsetting: 'Пожалуйста, настройте сервер. В настоящее время Realtime поддерживает только удаленные службы; для локальных услуг свяжитесь с автором.', rjcloded: 'Соединение разорвано', checkkey: 'Пожалуйста, проверьте правильность API-ключа', rtsuccess: 'Соединение нормально, поддерживаем звонок', rtservererror: 'Ошибка подключения к серверу WebSocket!', rtservererror2: 'Запись не поддерживается, возможно, это связано с устройством!', rtconecting: 'Подключение к серверу' ,"confirmDelete": "Вы уверены, что хотите удалить?", "pikaabout": "О Pika", "pikaserver": "Адрес API Pika", "pikakeyPlaceholder": "API-ключ Pika (необязательно)", "createFail": "Не удалось создать", "selecteff": "Эффект справки", "udioabout": "О Udio", "udiokeyPlaceholder": "API-ключ Udio (необязательно)", "udioserver": "Адрес API Udio", "ud_prompt": "Подсказка", "ud_prompt_pls": "Подсказка: Описание, Стиль", "ud_ly_write": "Пользовательские тексты", "ud_ly_auto": "Интеллектуальные тексты", "ud_ly_null": "Чистая музыка", "ud_v32": "Доступно", "ud_v130": "Долгое время", "ud_info": "Примечание:
    • 1. Udio-32 имеет короткую продолжительность
    • 2. Udio-130 стоит вдвое дороже Udio-32
    • 3. В подсказке можно указать стиль, описание и т. д.
    ", "ud_fail": "Не удалось сгенерировать эту песню!", "ud_doing": "Нельзя воспроизводить во время генерации", "ud_continuation": "Продолжение", "ud_precede": "Предшествующее", "upImg2": "Загрузить изображение
    Эта модель поддерживает распознавание изображений
    Примечание: будут дополнительные расходы на изображения
    Форматы: jpeg jpg png gif

    Поддерживает перетаскивание

    Загрузить MP3 MP4
    Автоматически вызовет модель whisper-1
    Форматы: mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "Примечание:
    • 1. Должно быть изображение
    • 2. Модель имеет только одну gen3a_turbo
    • 3. Цена за 10 секунд вдвое выше, чем за 5 секунд
    ", "rml_heng": "Пейзаж", "rml_shu": "Портрет", "pixabout": "Связано с Pixverse", "pixkeyPlaceholder": "API-ключ Pixverse можно оставить пустым", "pixserver": "Адрес API Pixverse", "pixinfo": " Описание:
    • 1. Основано на v3.5 360p продолжительность 5s режим Normal
    • 2. v2.5 это 0.5 раза
    • 3. Продолжительность 10s это 2 раза
    • 4. 540P это 1.5 раза, 720P это 2 раза, 1080P это 4 раза
    • 5. Режим производительности это 2 раза
    • 6. Множители умножаются, например, 720P продолжительность 10s это 2*2, что составляет 4 раза, и если добавить производительность, то это будет 8 раз
    " , "riffabout": "О Riffusion", "riffkeyPlaceholder": "API-ключ Riffusion (необязательно)", "riffserver": "Адрес API Riffusion", "riffinfo": "Описание", "editImage": "Редактирование изображения", "editVideo": "Изображение в видео", "moreset": "Дополнительные параметры" }, "mjset": { "server": "Сервер", "about": "О нас", "model": "Модель", "sysname": "Искусственный интеллект для рисования" }, "mjtab": { "chat": "Чат", "draw": "Рисование", "drawinfo": "Рисование с использованием искусственного интеллекта Midjourney", "gallery": "Галерея", "galleryInfo": "Моя галерея" }, "mjchat": { "loading": "Идет загрузка изображения", "openurl": "Открыть ссылку напрямую", "failReason": "Причина сбоя:", "reload": "Перезагрузить", "progress": "Прогресс:", "wait": "Задача отправлена, подождите...", "reroll": "Перерисовать", "wait2": "Задача {id} отправлена, подождите", "redrawEditing": "Редактирование части изображения", "face": "Сменить лицо", "blend": "Смешивание изображений", "draw": "Рисовать", "submiting": "Отправка...", "submit": "Отправить", "wait3": "Пожалуйста, не закрывайте! Создание изображения...", "success": "Сохранено успешно", "successTitle": "Успешно", "modlePlaceholder": "Пользовательские модели (разделять пробелами, необязательно)", "myModle": "Мои модели", "historyCnt": "Количество контекста", "historyToken": "Больше контекста делает память точнее, но расходует больше квоты", "historyTCnt": "Количество ответов", "historyTCntInfo": "Больше ответов, возможно, потребуется больше квоты", "role": "Настройка роли", "rolePlaceholder": "Дайте своему разговору уникальную роль, необязательно", "loading2": "Загрузка...", "loadmore": "Загрузить еще", "nofind": "Не удалось найти", "nofind2": "Связанные материалы отсутствуют. Попробуйте следующее", "success2": "Переключение успешно!", "modelChange": "Смена модели", "search": "Поиск", "searchPlaceholder": "Имя и описание GPTs", "attr": "Прикрепленные файлы", "noproduct": "В галерее пока нет ваших работ", "myGallery": "Моя галерея", "yourHead": "Ваш аватар", "your2Head": "Изображение знаменитости", "tipInfo": "Примечание:
  • 1 Изображение должно содержать лицо, иначе не будет изображения
  • 2 «Изображение знаменитости» можно сначала создать с помощью mj
  • 3 «Изображение знаменитости» может быть аниме
  • 4 «Ваш аватар» рекомендуется использовать фотографию лица
  • ", "placeInput": "Пожалуйста, введите подсказку!", "more5sb": "Максимум 5 изображений для загрузки", "exSuccess": "Экспорт успешен... Проверьте загрузки", "downloadSave": "aiрисование.txt", "noproducet": "Пока нет готовых работ", "imgBili": "Соотношение изображения", "imagEx": "Экспорт ссылок изображений", "prompt": "Подсказка", "imgCYes": "Содержит макет", "imgCUpload": "Загрузить свой макет", "imgCInfo": "Информация о макете:
    1. Макет позволяет использовать свои изображения для создания рисунков MJ
    2. Можно использовать несколько макетов, максимум 5, размер каждого изображения не более 1 Мб
    ", "imgCadd": "+Добавить", "del": "Удалить", "img2text": "Изображение в текст", "img2textinfo": "Не знаете, как написать подсказку? Попробуйте изображение в тексте!
    Передайте изображение, получите подсказку", "traning": "Перевод...", "imgcreate": "Создание изображения", "imginfo": "Дополнительные параметры:
  • 1 --no Игнорировать --no car, чтобы не рисовать машины на изображении
  • 2 --seed Получить сначала сид --seed 123456
  • 3 --chaos 10 Смешивание (диапазон: 0-100)
  • 4 --tile Фрагментирование
  • ", "tStyle": "Стиль", "tView": "Вид", "tShot": "Угол обзора", "tLight": "Освещение", "tQuality": "Качество изображения", "tStyles": "Уровень искусства", "tVersion": "Версия модели", "dalleInfo": "Инструкции:
  • 1 DALL-E - это модель от OpenAI для создания изображений
  • 2 Изображения от OpenAI имеют ограниченный срок годности, сделайте резервную копию
  • 3 Внимание: изображения размером 1790 пикселей стоят вдвое дороже
  • ", "version": "Версия", "size": "Размер", "blendInfo": "Инструкции:
  • 1 Смешивание как минимум двух изображений
  • 2 Максимальное количество загружаемых изображений - 6
  • ", "blendStart": "Начать смешивание", "no2add": "Не добавляйте одно и то же изображение повторно", "add2more": "Добавьте как минимум два изображения", "no1m": "Размер изображения не должен превышать 1 Мб", "imgExt": "Формат изображения должен быть jpg, gif, png, jpeg", "setSync": "Синхронизировать Midjourney и Suno" ,"addGPTS": "Добавить GPTs", "addPlaceholder": "Вставьте GID GPTs сюда или прямо вставьте ссылку на GPTs", "gidError": "Не найден действительный GID, пожалуйста, заполните еще раз", "success3": "GPTs успешно добавлены!" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "Режим описания", "custom": "Профессиональный режим", "style": "Стиль песни", "stylepls": "Название песни, например, Поп-музыка", "emputy": "Нет доступного содержимого", "noly": "Текст песни недоступен", "inputly": "Пожалуйста, введите название песни или текст", "doingly": "В процессе, пожалуйста, подождите.", "doingly2": "Получение текста...", "title": "Название песни", "titlepls": "Название песни, например, Каникулы", "desc": "Описание песни", "descpls": "Описание песни, например, Оригинальная поп-музыка о каникулах", "noneedly": "Текст песни не требуется", "rank": "Случайный выбор", "ly": "Текст песни", "lypls": "Текст песни: с определенным форматом", "generate": "Создать песню", "generately": "Сгенерировать текст", "nodata": "Пожалуйста, сначала создайте песню, чтобы получить список песен", "menu": "Музыка", "menuinfo": "Создание музыки Suno", "server": "Конечная точка API Suno", "serverabout": "Связанные с Suno", "setOpenKeyPlaceholder": "Связанный ключ для API Suno; необязательно", upMps: 'Загрузить аудио', extend: 'Расширить', extendFrom: 'Расширить от', extendAt: 'Расширение начинается с', fail: 'Неудача', info: 'Инструкции:
    Длительность загружаемого аудио должна быть от 6 до 60 секунд' } ,video:{ "menu": "Видео", "menuinfo": "Создание видео Luma и других", "descpls": "Описание создания видео", "lumaabout": "О Luma", "lumaserver": "Адрес API Luma", "setOpenKeyPlaceholder": "Ключ API Luma, необязательно", "generate": "Создать видео", "nodata": "Нет доступных видео, сначала сгенерируйте!", "selectimg": "Выберите изображение", "clear": "Очистить", "plsInput": "Введите содержимое!", "submitSuccess": "Успешно отправлено!", "process": "Создание видео...", "repeat": "Повторить", "lumainfo": "Объяснение:
    • 1. Видеоролики Pro и relax имеют водяные знаки на ссылках.
    • 2. Версия Pro без водяных знаков требует получения ссылки на скачивание через кнопку «Скачать».
    • 3. Ссылки на версии Pro имеют временные ограничения; пожалуйста, немедленно сохраните файл MP4 локально.
    • 4. Для версий Pro сохраните файл MP4 локально в течение 30 минут после создания, так как канал может быть заблокирован или закрыт.
    • 5. Если ссылка для загрузки версий Pro недействительна, будет предоставлена ссылка на видео с водяными знаками.
    ", "runwayabout": "Связанные с Runway", "runwayserver": "Адрес API Runway", "setOpenKeyPlaceholder2": "Ключ API Runway, необязательно", "endImg": "Конечное изображение", "runwayinfo": "Объяснение:
    • 1. У изображений и видеороликов Runway есть срок действия.
    • 2. Пожалуйста, сохраните файл MP4 локально в течение 30 минут после создания видео.
    ", "nosup": "Временно не поддерживается", "rwgen2": "Версия: Gen-2, экономичная", "rwgen3": "Версия: Gen-3 Alpha", "repeat2":"Expired.Reget" } , dance:{ menu: "Танец", menuinfo: "Создание танцевальных видео с Viggle и другими.", character: "Персонаж", viggleabout: "О Viggle", viggleserver: "Адрес API Viggle", setOpenKeyPlaceholder: "Ключ API Viggle, необязательно", info: "Инструкции:
    1. Изображения персонажей лучше всего делать полноразмерными фотографиями.
    2. Видео танцевальных шаблонов должны быть личными, а не групповыми.", model: "Модель", bgw: "Белый фон", bgg: "Зеленый фон", bgmoban: "Фон шаблона", bgrole: "Фон персонажа", gring: "Генерация...", uprolefirst: "Пожалуйста, сначала загрузите изображение персонажа", uprolefail: "Ошибка загрузки", upvideo: "+ Загрузить шаблонное танцевальное видео", usevideo: "+ Использовать официальный шаблон", moban: "Танцевальный шаблон", moban2: "Название шаблона", use: "Использовать" } } ================================================ FILE: src/locales/tr-TR.ts ================================================ export default { common: { add: 'Ekle', addSuccess: 'Ekleme Başarılı', edit: 'Düzenle', editSuccess: 'Düzenleme Başarılı', delete: 'Sil', deleteSuccess: 'Silme Başarılı', save: 'Kaydet', saveSuccess: 'Kaydetme Başarılı', reset: 'Sıfırla', action: 'Eylem', export: 'Dışa Aktar', exportSuccess: 'Dışa Aktarma Başarılı', import: 'İçe Aktar', importSuccess: 'İçe Aktarma Başarılı', clear: 'Temizle', clearSuccess: 'Temizleme Başarılı', yes: 'Evet', no: 'Hayır', confirm: 'Onayla', download: 'İndir', noData: 'Veri Yok', wrong: 'Bir şeyler yanlış gitti, lütfen daha sonra tekrar deneyin.', success: 'Başarılı', failed: 'Başarısız', verify: 'Doğrula', unauthorizedTips: 'Yetkisiz, lütfen önce doğrulama yapın.', stopResponding: 'Cevap Vermeyi Durdur', }, chat: { newChatButton: 'Yeni Sohbet', //placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)', placeholder: 'Bana her şeyi sor, veya ekran görüntüleri yapıştır veya dosyayı sürükleyip bırak. (Shift + Enter = satır atla, "/" prompts tetiklemek için)', placeholderMobile: 'Bana her şeyi sor...', copy: 'Kopyala', copied: 'Kopyalandı', copyCode: 'Kodu Kopyala', clearChat: 'Sohbeti Temizle', clearChatConfirm: 'Bu sohbeti temizlemek istediğinizden emin misiniz?', exportImage: 'Resmi Dışa Aktar', exportImageConfirm: 'Bu sohbeti png olarak dışa aktarmak istediğinizden emin misiniz?', exportSuccess: 'Dışa Aktarma Başarılı', exportFailed: 'Dışa Aktarma Başarısız', usingContext: 'Bağlam Modu', turnOnContext: 'Mevcut modda mesaj göndermek, önceki sohbet kayıtlarını taşıyacak.', turnOffContext: 'Mevcut modda mesaj göndermek, önceki sohbet kayıtlarını taşımayacak.', deleteMessage: 'Mesajı Sil', deleteMessageConfirm: 'Bu mesajı silmek istediğinizden emin misiniz?', deleteHistoryConfirm: 'Bu geçmişi silmek istediğinizden emin misiniz?', clearHistoryConfirm: 'Bu sohbet geçmişini silmek istediğinizden emin misiniz?', preview: 'Önizleme', showRawText: 'Ham metin olarak göster', }, setting: { setting: 'Ayarlar', general: 'Genel', advanced: 'Gelişmiş', config: 'Yapılandırma', avatarLink: 'Avatar Bağlantısı', name: 'Ad', description: 'Açıklama', backgroundImage: 'Arka Plan', role: 'Rol', temperature: 'Sıcaklık', top_p: 'Top_p', resetUserInfo: 'Kullanıcı Bilgilerini Sıfırla', chatHistory: 'Sohbet Geçmişi', theme: 'Tema', language: 'Dil', webdavSync: 'WebDAV Senkronizasyonu', webdavConfig: 'Yapılandırma', webdavUrl: 'WebDAV Adresi', webdavUsername: 'Kullanıcı Adı', webdavPassword: 'Şifre', webdavConfigError: 'Lütfen tam WebDAV yapılandırmasını doldurun', webdavNotConfigured: 'Lütfen önce WebDAV\'ı yapılandırın', webdavSyncSuccess: 'Senkronizasyon başarılı', webdavSyncError: 'Senkronizasyon başarısız', webdavTest: 'Bağlantıyı Test Et', webdavUpload: 'Yükle', webdavDownload: 'İndir', api: 'API', reverseProxy: 'Ters Proxy', timeout: 'Zaman Aşımı', socks: 'Socks', httpsProxy: 'HTTPS Proxy', balance: 'API Bakiyesi', monthlyUsage: 'Aylık Kullanım', }, store: { siderButton: 'Prompt Mağazası', local: 'Yerel', online: 'Çevrimiçi', title: 'Başlık', description: 'Açıklama', clearStoreConfirm: 'Verileri silmek istediğinize emin misiniz?', importPlaceholder: 'Lütfen buraya JSON verilerini yapıştırın', addRepeatTitleTips: 'Başlık tekrarı, lütfen tekrar girin', addRepeatContentTips: 'İçerik tekrarı: {msg}, lütfen tekrar girin', editRepeatTitleTips: 'Başlık çakışması, lütfen düzeltin', editRepeatContentTips: 'İçerik çakışması {msg}, lütfen tekrar düzenleyin', importError: 'Anahtar değeri uyumsuzluk', importRepeatTitle: 'Başlık tekrarlı olarak atlandı: {msg}', importRepeatContent: 'İçerik tekrarlı olarak atlandı: {msg}', onlineImportWarning: 'Not: Lütfen JSON dosyası kaynağını kontrol edin!', downloadError: 'Lütfen ağ durumunu ve JSON dosyasının geçerliliğini kontrol edin', }, "mj": { "setOpen": "OpenAI İlişkilendirilmiş", "setOpenPlaceholder": "http(s):// içermelidir", "setOpenUrl": "OpenAI API Adresi", "setOpenKeyPlaceholder": "Parola erişim kısıtlamalarını atlamak için özel OpenAI Anahtarı kullan", "setMj": "Midjourney İlişkilendirilmiş", "setMjUrl": "Midjourney API Adresi:", "setMjKeyPlaceholder": "Parola erişim kısıtlamalarını atlamak için özel Api Secret kullan", "setUploader": "Yükleme İlişkilendirilmiş", "setUploaderUrl": "Yükleme Adresi:", "setBtSave": "Kaydet", "setBtBack": "Varsayılanı Geri Yükle", "redraw": "Yeniden Çiz", "fail1": "Lütfen sabırlı olun, yükleniyor.", "success1": "Resim başarıyla yenilendi!", "high_variation": "Güçlü Varyasyon", "low_variation": "Zayıf Varyasyon", "p15": "Zoom 1.5x", "p20": "Zoom 2x", "p100": "Normal", "retry": "Tekrar Dene", "pan_left": "Sol", "pan_right": "Sağ", "pan_up": "Yukarı", "pan_down": "Aşağı", "up2": "HD 2x", "up4": "HD 4x" , "thinking": "Düşünüyor...", "noReUpload": "Yeniden yüklenemiyor", "uploading": "Yükleniyor...", "uploadSuccess": "Yükleme başarılı", "uploadFail": "Yükleme başarısız:", "upPdf": "Resim veya ek yükleyin
    Resimler, PDF'ler, EXCEL ve diğer belgeleri yükleyebilirsiniz

    Sürükle ve bırak desteği

    ", "upImg": "Resim yükleyin
    Otomatik olarak gpt-4-vision-preview modelini çağırır
    Not: Ek resim ücretleri uygulanabilir
    Formatlar: jpeg, jpg, png, gif

    Sürükle ve bırak desteği

    MP3 MP4 Yükle
    Otomatik olarak whisper-1 modelini çağırır
    Formatlar: mp3, mp4, mpeg, mpga, m4a, wav, webm

    ", "clearAll": "Parametreleri Temizle", "czoom": "Özel", "customTitle": "Özel zoom", "zoominfo": "Zoom değerini değiştirin, 1.0 ile 2.0 arasında, varsayılan 1.8 olarak ayarlanmıştır", "modleSuccess": "Model başarıyla yüklendi", "setingSuccess": "Ayarlar başarılı", "tokenInfo1": "Kalan Jetonlar = Model Uzunluğu - Rol Ayarı - Bağlam (Sohbet Geçmişi) - Yanıt Sayısı - Mevcut Giriş", "tokenInfo2": "Rol ayarı boş bırakılırsa, sistem varsayılan bir tane sağlar.", "noSuppertModel": "Yenile, bu model şu anda desteklenmiyor!", "failOcr": "Tanıma başarısız", "remain": "Kalan:", "totalUsage": "Toplam abonelik miktarı", "disableGpt4": "GPT4 devre dışı", "setTextInfo": "OpenAI API Anahtarı hatası, buraya tıklayarak yeniden deneyin", "attr1": "Attr", "ulink": "Resim Bağlantısı", "copyFail": "Kopyalama Başarısız", "tts": "Metinden Sese", "fail": "Hata", "noSupperChrom": "Tarayıcı desteklenmiyor!", "lang": "Ses", "ttsLoading": "Sese Dönüştürülüyor...", "ttsSuccess": "Dönüşüm başarılı", "micIng": "Kaydediliyor, bir şey söyle...", "mStart": "Başlat", "mPause": "Duraklat", "mGoon": "Devam", "mRecord": "Yeniden kaydet", "mPlay": "Oynat", "mCanel": "İptal", "mSent": "Gönder", "findVersion": "Güncellenmiş sürümü keşfet", "yesLastVersion": "Zaten en son sürümde", "infoStar": 'Bu proje GitHub üzerinde açık kaynaklı, ücretsiz ve MIT lisansına dayanmaktadır, herhangi bir ödeme şekli yoktur!

    Bu projeyi yararlı bulursanız, lütfen GitHub üzerinde yıldız verin, teşekkür ederim!', "setBtSaveChat": "Sadece sohbeti kaydet", "setBtSaveSys": "Sisteme kaydet", "wsrvClose": "wsrv'yi kapat", "wsrvOpen": "wsrv'yi aç", "temperature": "Rastlantısallık", "temperatureInfo": "(temperature) değeri arttıkça yanıtlar daha rastlantısal hale gelir", "top_p": "Üst Olasılık Örnekleme", "top_pInfo": "(top_p) rastlantısallığa benzer ancak sıcaklık ile birlikte değiştirilmemelidir", "presence_penalty": "Konu Tazeliği", "presence_penaltyInfo": "(presence_penalty) değeri arttıkça, yeni konulara genişleme olasılığı daha yüksektir", "frequency_penalty": "Frekans Cezası", "frequency_penaltyInfo": "(frequency_penalty) değeri arttıkça, tekrarlanan kelimelerin azaltılma olasılığı daha yüksektir" ,"tts_voice": "TTS Ses Karakteri", "typing": "Yazıyor", "authErro": "Yetkilendirme başarısız", "authBt": "Lütfen yetkilendirme erişim şifresini yeniden girin", "micWhisper": "Fısıltı konuşma tanıma", "micAsr": "Anında tanıma", "micRec": "Kayıt başlat, lütfen konuşun! 2 saniye boyunca ses yoksa otomatik olarak duracaktır.", "micRecEnd": "Kayıt sona erdi", subtle: 'Haute définition 2x' ,creative: 'Haute définition 2x. Créatif' ,gpt_gx: 'Les GPT utilisent g-*', "ideoabout": "Ideogram Hakkında", "ideoserver": "Ideogram Sunucusu", "ideokeyPlaceholder": "Ideogram için API Anahtarı (isteğe bağlı)", "ideopls": "Görüntü açıklama ipuçları", "nohead": "Dahil değil", klingabout: 'Kling Hakkında', klingserver: 'Kling API Adresi', klingkeyPlaceholder: 'Kling API Anahtarı (isteğe bağlı)', klingkey: 'Kling Anahtarı', mode: 'Mod', duration: 'Süre', negative_prompt: 'Nesne içermeyen metni buraya yerleştirin', std: 'Yüksek Performans', pro: 'Yüksek Kalite', needImg: 'Etki etmesi için lütfen bir referans resmi yükleyin!', seed: 'Tohum numarası 1~2147483647', klingInfo: 'Açıklama:

  • 1. Yüksek kalite fiyatın 3.5 katıdır
  • 2. 10 saniye fiyatın 2 katıdır
  • 3. Son kare etkili olması için bir referans resmine sahip olmalıdır
  • ' ,"camera_type": "Lens", "cnull": "Akıllı eşleştirme", "down_back": "Aşağı ve geri git", "forward_up": "İleri it ve yukarı kaldır", "right_turn_forward": "Sağa dön ve ileri git", "left_turn_forward": "Sola dön ve ileri git" ,kling:'Kling', rttab: 'Ses', rtinfo: 'Gerçek zamanlı sesli görüşme hizmeti (realtime)', rtsetting: 'Lütfen sunucuyu ayarlayın. Şu anda Realtime yalnızca uzaktan hizmetleri desteklemektedir; yerel hizmetler için lütfen yazarla iletişime geçin.', rjcloded: 'Bağlantı kesildi', checkkey: 'API anahtarının doğru olup olmadığını kontrol edin', rtsuccess: 'Bağlantı normal, görüşmeyi sürdürüyor', rtservererror: 'WebSocket sunucu bağlantı hatası!', rtservererror2: 'Kaydetme desteklenmiyor, bu cihaz kaynaklı bir sorun olabilir!', rtconecting: 'Sunucuya bağlanılıyor', "confirmDelete": "Silmek istediğinize emin misiniz?", "pikaabout": "Pika Hakkında", "pikaserver": "Pika API Adresi", "pikakeyPlaceholder": "Pika API Anahtarı (isteğe bağlı)", "createFail": "Oluşturma başarısız", "selecteff": "Referans Etkisi", "udioabout": "Udio Hakkında", "udiokeyPlaceholder": "Udio API Anahtarı (isteğe bağlı)", "udioserver": "Udio API Adresi", "ud_prompt": "İpucu", "ud_prompt_pls": "İpucu: Açıklama, Tarz", "ud_ly_write": "Özel Şarkı Sözleri", "ud_ly_auto": "Akıllı Şarkı Sözleri", "ud_ly_null": "Saf Müzik", "ud_v32": "Uygun Fiyatlı", "ud_v130": "Uzun Süreli", "ud_info": "Not:
    • 1. Udio-32 kısa süreye sahiptir
    • 2. Udio-130, Udio-32'nin iki katı fiyatındadır
    • 3. İpucu, tarz, açıklama vb. içerebilir
    ", "ud_fail": "Bu şarkının oluşturulması başarısız oldu!", "ud_doing": "Oluşturma sırasında çalınamaz", "ud_continuation": "Devam", "ud_precede": "Önceki", "upImg2": "Görüntü Yükle
    Bu model görüntü tanımayı desteklemektedir
    Not: Ekstra görüntü ücretleri olacaktır
    Formatlar: jpeg jpg png gif

    Sürükleyip bırakmayı destekler

    MP3 MP4 Yükle
    otomatik olarak whisper-1 modelini çağıracaktır
    Formatlar: mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "Not:
    • 1. Bir resim içermelidir
    • 2. Modelin yalnızca bir gen3a_turbo'su vardır
    • 3. 10 saniyenin fiyatı 5 saniyenin iki katıdır
    ", "rml_heng": "Yatay", "rml_shu": "Dikey", "pixabout": "Pixverse ile ilgili", "pixkeyPlaceholder": "Pixverse API Anahtarı boş bırakılabilir", "pixserver": "Pixverse API adresi", "pixinfo": " Açıklama:
    • 1. v3.5 360p süre 5s Normal moduna dayanmaktadır
    • 2. v2.5 0.5 katıdır
    • 3. Süre 10s 2 katıdır
    • 4. 540P 1.5 kat, 720P 2 kat, 1080P 4 katıdır
    • 5. Performans modu 2 katıdır
    • 6. Katlar çarpılır, örneğin 720P süre 10s 2*2 yani 4 katıdır, eğer performansı eklersek 8 kat olur
    ", "riffabout": "Riffusion Hakkında", "riffkeyPlaceholder": "Riffusion API Anahtarı (isteğe bağlı)", "riffserver": "Riffusion API Adresi", "riffinfo": "Açıklama", "editImage": "Görüntü Düzenleme", "editVideo": "Görüntüden Videoya", "moreset": "Daha Fazla Parametre", }, "mjset": { "server": "Sunucu", "about": "Hakkında", "model": "Model", "sysname": "Yapay Zeka Çizimi" }, "mjtab": { "chat": "Sohbet", "draw": "Çizim", "drawinfo": "Midjourney Motoru ile Yapay Zeka Çizimi", "gallery": "Galeri", "galleryInfo": "Benim Galerim" }, "mjchat": { "loading": "Resim Yükleniyor", "openurl": "Bağlantıyı Doğrudan Aç", "failReason": "Başarısızlık Nedeni:", "reload": "Yeniden Yükle", "progress": "İlerleme:", "wait": "Görev gönderildi, lütfen bekleyin...", "reroll": "Yeniden Çiz", "wait2": "Görev {id} gönderildi, lütfen bekleyin", "redrawEditing": "Kısmi Yeniden Çiz Düzenleme", "face": "Yüz Değiştir", "blend": "Resimleri Karıştır", "draw": "Çizim", "submiting": "Gönderiliyor", "submit": "Gönder", "wait3": "Lütfen kapatmayın! Resim oluşturuluyor...", "success": "Başarıyla Kaydedildi", "successTitle": "Başarı", "modlePlaceholder": "Özel modeller, boşluklarla ayrılmış (isteğe bağlı)", "myModle": "Özel Modeller", "historyCnt": "Bağlam Sayısı", "historyToken": "Daha fazla bağlam, doğruluğu artırır ancak daha fazla kredi tüketir", "historyTCnt": "Yanıt Sayısı", "historyTCntInfo": "Daha yüksek yanıt sayısı daha fazla kredi tüketebilir", "role": "Rol Ayarı", "rolePlaceholder": "Konuşmanız için özel bir rol ayarlayın (isteğe bağlı)", "loading2": "Yükleniyor...", "loadmore": "Daha Fazla Yükle", "nofind": "Bulunamadı", "nofind2": "ilgili içerik. Aşağıdakileri deneyebilirsiniz:", "success2": "Değiştirme Başarılı!", "modelChange": "Model Değişikliği", "search": "Ara", "searchPlaceholder": "GPT isimleri, açıklamalar", "attr": "Ekler", "noproduct": "Galari henüz giriş yapmamış", "myGallery": "Benim Galerim", "yourHead": "Senin Avatarın", "your2Head": "Ünlü Resim", "tipInfo": "Not:
  • 1. Resimlerin uygun bir şekilde oluşturulması için yüz içermesi gerekir
  • 2. 'Ünlü Resim', MJ çizimi kullanılarak oluşturulabilir
  • 3. 'Ünlü Resim', aynı zamanda anime karakterlerini içerebilir
  • 4. 'Senin Avatarın', bir pasaport fotoğrafı boyutunda olması önerilir
  • ", "placeInput": "Lütfen prompt'u doldurun!", "more5sb": "En fazla 5 resim yükleyin", "exSuccess": "Başarıyla Dışa Aktar... İndirme klasörünü kontrol edin", "downloadSave": "ai_drawing.txt", "noproducet": "Şu anda olgun çalışma yok", "imgBili": "Resim Oranı", "imagEx": "Sanat Eseri Resim Bağlantılarını Dışa Aktar", "prompt": "Prompts", "imgCYes": "Temel Resim İçerir", "imgCUpload": "Temel Resim Yükle", "imgCInfo": "Temel Resim Bilgisi:
    1. MJ çizimi için kendi resimlerinizi temel olarak kullanın
    2. Birden fazla temel resim kullanabilirsiniz, her biri 1M boyutunu geçmemeli", "imgCadd": "+Ekle", "del": "Sil", "img2text": "Resimden Metne", "img2textinfo": "Hangi prompts kullanacağınızdan emin değil misiniz? Resimden Metne'yi deneyin! Bir resim göndererek prompts alın", "traning": "Çevriliyor...", "imgcreate": "Resim Oluştur", "imginfo": "Diğer parametreler:
  • 1 --no: Resimden arabaları hariç tutmak için --no car'ı yoksayın
  • 2 --seed: --seed 123456 ile önce bir tohum alın
  • 3 --chaos 10: Karıştırma (aralık: 0-100)
  • 4 --tile: Parçalama
  • ", "tStyle": "Stil", "tView": "Görünüm", "tShot": "Karakter Çekimi", "tLight": "Aydınlatma", "tQuality": "Resim Kalitesi", "tStyles": "Sanatsal Seviye", "tVersion": "Model Sürümü", "dalleInfo": "Not:
  • 1. DALL-E, OpenAI tarafından sağlanan bir resim oluşturma modelidir
  • 2. OpenAI resimlerinin bir son kullanma tarihi vardır, bu nedenle yedekleme yapın
  • 3. Not: 1790px resimlerin fiyatı iki katıdır
  • ", "version": "Sürüm", "size": "Boyut", "blendInfo": "Not:
  • 1. En az 2 resmi karıştırın
  • 2. Karıştırmak için en fazla 6 resim kullanılabilir
  • ", "blendStart": "Karışımı Başlat", "no2add": "Çift resim ekleme", "add2more": "Lütfen iki veya daha fazla resim ekleyin", "no1m": "Resim boyutu 1M'yi aşamaz", "imgExt": "Resimler sadece jpg, gif, png, jpeg formatlarını destekler", "setSync": "Midjourney ve Suno'yu senkronize et", "addGPTS": "GPT'ler Ekle", "addPlaceholder": "GPT'lerin GID'sini buraya yapıştırın veya GPT'lerin bağlantısını doğrudan yapıştırın", "gidError": "Geçerli GID bulunamadı, lütfen tekrar doldurun", "success3": "GPT'ler başarıyla eklendi!" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "Açıklama Modu", "custom": "Profesyonel Mod", "style": "Şarkı Tarzı", "stylepls": "Şarkı Adı, örneğin: Pop Müzik", "emputy": "Mevcut içerik yok", "noly": "Söz yok", "inputly": "Lütfen şarkı adını veya sözleri girin", "doingly": "Devam ediyor, lütfen bekleyin.", "doingly2": "Sözler getiriliyor...", "title": "Şarkı Adı", "titlepls": "Şarkı Adı, örneğin: Tatil", "desc": "Şarkı Açıklaması", "descpls": "Şarkı açıklaması, örneğin: Tatil hakkında orijinal pop müziği", "noneedly": "Söz gerekli değil", "rank": "Rastgele seçim", "ly": "Sözler", "lypls": "Sözler: belirli bir formatta", "generate": "Şarkı Oluştur", "generately": "Sözler Oluştur", "nodata": "Lütfen önce şarkı oluşturun ki şarkı listesi olsun", "menu": "Müzik", "menuinfo": "Suno Müzik Oluşturma", "server": "Suno API Uç Noktası", "serverabout": "Suno İlgili", "setOpenKeyPlaceholder": "Suno API için İlgili Anahtar; isteğe bağlı", upMps: 'Ses yükle', extend: 'Genişlet', extendFrom: 'Şundan genişlet', extendAt: 'Genişletmeyi başlat', fail: 'Başarısız', info: 'Açıklamalar:
    Yüklenen sesin süresi 6 saniye ile 60 saniye arasında olmalıdır' } ,video:{ "menu": "Videolar", "menuinfo": "Luma ve diğer video oluşturma", "descpls": "Video oluşturma açıklaması", "lumaabout": "Luma Hakkında", "lumaserver": "Luma API adresi", "setOpenKeyPlaceholder": "Luma API anahtarı, isteğe bağlı", "generate": "Video Oluştur", "nodata": "Mevcut video yok, lütfen önce oluşturun!", "selectimg": "Resim Seç", "clear": "Temizle", "plsInput": "Lütfen içerik girin!", "submitSuccess": "Başarıyla gönderildi!", "process": "Video oluşturuluyor...", "repeat": "Yeniden dene", "lumainfo": "Açıklama:
    • 1. Pro ve rahat demo videoları su işareti olan bağlantılara sahiptir.
    • 2. Pro su işaretsiz sürüm, 'İndir' düğmesi aracılığıyla indirme bağlantısını almayı gerektirir.
    • 3. Pro sürümler için bağlantılar zaman sınırlıdır; lütfen MP4 dosyasını yerel olarak zamanında kaydedin.
    • 4. Pro sürümler için, 30 dakika içinde MP4 dosyasını yerel olarak kaydedin, çünkü kanal engellenebilir veya durdurulabilir.
    • 5. Pro sürümleri için indirme bağlantısı geçersizse, su işareti olan video bağlantısı sağlanacaktır.
    ", "runwayabout": "Runway ile İlgili", "runwayserver": "Runway API Adresi", "setOpenKeyPlaceholder2": "Runway API anahtarı, isteğe bağlı", "endImg": "Son kare", "runwayinfo": "Açıklama:
    • 1. Runway görüntüleri ve videoları geçerlilik süresine sahiptir.
    • 2. Lütfen video oluşturduktan sonra 30 dakika içinde MP4 dosyasını yerel olarak kaydedin.
    ", "nosup": "Geçici olarak desteklenmiyor", "rwgen2": "Sürüm: Gen-2, maliyet etkin", "rwgen3": "Sürüm: Gen-3 Alpha", "repeat2":"Expired.Reget" } , dance:{ menu: "Dans", menuinfo: "Viggle ve diğerleri ile dans videoları oluşturun.", character: "Karakter", viggleabout: "Viggle Hakkında", viggleserver: "Viggle API Endpoint", setOpenKeyPlaceholder: "Viggle API anahtarı, isteğe bağlı", info: "Yönergeler:
    1. Karakter görüntüleri tercihen tam boy fotoğraflar olmalıdır.
    2. Dans şablonu videoları kişisel videolar olmalı, grup dansları değil.", model: "Model", bgw: "Beyaz Arka Plan", bgg: "Yeşil Arka Plan", bgmoban: "Şablon Arka Planı", bgrole: "Karakter Arka Planı", gring: "Oluşturuluyor...", uprolefirst: "Lütfen önce karakter resmi yükleyin", uprolefail: "Yükleme başarısız oldu", upvideo: "+ Şablon Dans Videosu Yükle", usevideo: "+ Resmi Şablonu Kullan", moban: "Dans Şablonu", moban2: "Şablon Adı", use: "Kullan" } } ================================================ FILE: src/locales/vi-VN.ts ================================================ export default { common: { add: 'Thêm', addSuccess: 'Thêm thành công', edit: 'Sửa', editSuccess: 'Sửa thành công', delete: 'Xóa', deleteSuccess: 'Xóa thành công', save: 'Lưu', saveSuccess: 'Lưu thành công', reset: 'Đặt lại', action: 'Hành động', export: 'Xuất', exportSuccess: 'Xuất thành công', import: 'Nhập', importSuccess: 'Nhập thành công', clear: 'Dọn dẹp', clearSuccess: 'Dọn dẹp thành công', yes: 'Có', no: 'Không', confirm: 'Xác nhận', download: 'Tải xuống', noData: 'Không có dữ liệu', wrong: 'Đã xảy ra lỗi, vui lòng thử lại sau.', success: 'Thành công', failed: 'Thất bại', verify: 'Xác minh', unauthorizedTips: 'Không được ủy quyền, vui lòng xác minh trước.', }, chat: { newChatButton: 'Tạo hội thoại', placeholder: 'Hỏi tôi bất cứ điều gì...(Shift + Enter = ngắt dòng, "/" to trigger prompts)', placeholderMobile: 'Hỏi tôi bất cứ điều gì...', copy: 'Sao chép', copied: 'Đã sao chép', copyCode: 'Sao chép Code', clearChat: 'Clear Chat', clearChatConfirm: 'Bạn có chắc chắn xóa cuộc trò chuyện này?', exportImage: 'Xuất hình ảnh', exportImageConfirm: 'Bạn có chắc chắn xuất cuộc trò chuyện này sang png không?', exportSuccess: 'Xuất thành công', exportFailed: 'Xuất thất bại', usingContext: 'Context Mode', turnOnContext: 'Ở chế độ hiện tại, việc gửi tin nhắn sẽ mang theo các bản ghi trò chuyện trước đó.', turnOffContext: 'Ở chế độ hiện tại, việc gửi tin nhắn sẽ không mang theo các bản ghi trò chuyện trước đó.', deleteMessage: 'Xóa tin nhắn', deleteMessageConfirm: 'Bạn có chắc chắn xóa tin nhắn này?', deleteHistoryConfirm: 'Bạn có chắc chắn để xóa lịch sử này?', clearHistoryConfirm: 'Bạn có chắc chắn để xóa lịch sử trò chuyện?', preview: 'Xem trước', showRawText: 'Hiển thị dưới dạng văn bản thô', }, setting: { setting: 'Cài đặt', general: 'Chung', advanced: 'Nâng cao', config: 'Cấu hình', avatarLink: 'Avatar Link', name: 'Tên', description: 'Miêu tả', backgroundImage: 'Ảnh nền', role: 'Vai trò', temperature: 'Nhiệt độ', top_p: 'Top_p', resetUserInfo: 'Đặt lại thông tin người dùng', chatHistory: 'Lịch sử trò chuyện', theme: 'Giao diện', language: 'Ngôn ngữ', webdavSync: 'Đồng bộ WebDAV', webdavConfig: 'Cấu hình', webdavUrl: 'Địa chỉ WebDAV', webdavUsername: 'Tên người dùng', webdavPassword: 'Mật khẩu', webdavConfigError: 'Vui lòng điền đầy đủ cấu hình WebDAV', webdavNotConfigured: 'Vui lòng cấu hình WebDAV trước', webdavSyncSuccess: 'Đồng bộ thành công', webdavSyncError: 'Đồng bộ thất bại', webdavTest: 'Kiểm tra kết nối', webdavUpload: 'Tải lên', webdavDownload: 'Tải xuống', api: 'API', reverseProxy: 'Reverse Proxy', timeout: 'Timeout', socks: 'Socks', httpsProxy: 'HTTPS Proxy', balance: 'API Balance', monthlyUsage: 'Sử dụng hàng tháng', }, store: { siderButton: 'Prompt Store', local: 'Local', online: 'Online', title: 'Tiêu đề', description: 'Miêu tả', clearStoreConfirm: 'Cho dù để xóa dữ liệu?', importPlaceholder: 'Vui lòng dán dữ liệu JSON vào đây', addRepeatTitleTips: 'Tiêu đề trùng lặp, vui lòng nhập lại', addRepeatContentTips: 'Nội dung trùng lặp: {msg}, vui lòng nhập lại', editRepeatTitleTips: 'Xung đột tiêu đề, vui lòng sửa lại', editRepeatContentTips: 'Xung đột nội dung {msg} , vui lòng sửa đổi lại', importError: 'Key value mismatch', importRepeatTitle: 'Tiêu đề liên tục bị bỏ qua: {msg}', importRepeatContent: 'Nội dung liên tục bị bỏ qua: {msg}', onlineImportWarning: 'Lưu ý: Vui lòng kiểm tra nguồn tệp JSON!', downloadError: 'Vui lòng kiểm tra trạng thái mạng và tính hợp lệ của tệp JSON', }, "mj": { "setOpen": "OpenAI liên quan", "setOpenPlaceholder": "Phải chứa http(s)://", "setOpenUrl": "Địa chỉ giao diện OpenAI", "setOpenKeyPlaceholder": "Sử dụng khóa OpenAI tùy chỉnh để bỏ qua hạn chế mật khẩu", "setMj": "Midjourney liên quan", "setMjUrl": "Địa chỉ giao diện Midjourney:", "setMjKeyPlaceholder": "Sử dụng Khóa Api Secret tùy chỉnh để bỏ qua hạn chế mật khẩu", "setUploader": "Tải lên liên quan", "setUploaderUrl": "Địa chỉ tải lên:", "setBtSave": "Lưu", "setBtBack": "Khôi phục mặc định", "redraw": "Vẽ Lại Phần", "fail1": "Anh/chị đừng vội, đang tải đó.", "success1": "Ảnh đã làm mới thành công!", "high_variation": "Biến Động Mạnh", "low_variation": "Biến Động Nhẹ", "p15": "Thu Phóng 1.5 lần", "p20": "Thu Phóng 2 lần", "p100": "Bình thường", "retry": "Thử Lại Phân Tích", "pan_left": "Phân Tích Lại Bên Trái", "pan_right": "Phân Tích Lại Bên Phải", "pan_up": "Phân Tích Lại Lên", "pan_down": "Phân Tích Lại Xuống", "up2": "Độ Phân Giải Cao 2 lần", "up4": "Độ Phân Giải Cao 4 lần", "thinking": "Đang suy nghĩ...", "noReUpload": "Không thể tải lên lại", "uploading": "Đang tải lên...", "uploadSuccess": "Tải lên thành công", "uploadFail": "Tải lên thất bại:", "upPdf": "Tải lên hình ảnh hoặc tệp đính kèm
    Bạn có thể tải lên hình ảnh, PDF, EXCEL và các tài liệu khác

    Hỗ trợ kéo và thả

    ", "upImg": "Tải lên hình ảnh
    Sẽ tự động gọi mô hình gpt-4-vision-preview
    Chú ý: Có thể áp dụng phí ảnh bổ sung
    Định dạng: jpeg, jpg, png, gif

    Hỗ trợ kéo và thả

    Tải lên MP3 MP4
    Sẽ tự động gọi mô hình whisper-1
    Định dạng: mp3, mp4, mpeg, mpga, m4a, wav, webm

    ", "clearAll": "Xóa tất cả các tham số", "czoom": "Tùy chỉnh", "customTitle": "Tùy chỉnh zoom", "zoominfo": "Sửa giá trị zoom, khoảng từ 1.0 đến 2.0, mặc định được đặt là 1.8", "modleSuccess": "Tải mô hình thành công", "setingSuccess": "Thiết lập thành công", "tokenInfo1": "Còn lại Tokens = Độ dài mô hình - Thiết lập vai trò - Bối cảnh (Lịch sử cuộc trò chuyện) - Số phản hồi - Đầu vào hiện tại", "tokenInfo2": "Để trống thiết lập vai trò và hệ thống sẽ cung cấp một giá trị mặc định.", "noSuppertModel": "Làm mới, hiện tại mô hình này không được hỗ trợ!", "failOcr": "Nhận dạng thất bại", "remain": "Còn:", "totalUsage": "Tổng số tiền đăng ký", "disableGpt4": "GPT4 đã tắt", "setTextInfo": "Lỗi Khóa API OpenAI, nhấp vào đây để thử lại" , "attr1": "Đính", "ulink": "Liên kết Ảnh gốc", "copyFail": "Sao chép thất bại", "tts": "Văn bản thành Tiếng nói (TTS)", "fail": "Đã xảy ra lỗi", "noSupperChrom": "Trình duyệt không được hỗ trợ!", "lang": "Âm thanh", "ttsLoading": "Đang chuyển đổi thành tiếng nói...", "ttsSuccess": "Chuyển đổi thành công", "micIng": "Đang ghi âm, nói điều gì đó...", "mStart": "Bắt đầu", "mPause": "Tạm dừng", "mGoon": "Tiếp tục", "mRecord": "Ghi lại", "mPlay": "Phát", "mCanel": "Hủy", "mSent": "Gửi", "findVersion": "Phát hiện phiên bản cập nhật", "yesLastVersion": "Đã là phiên bản mới nhất", "infoStar": "Dự án này được mở nguồn tại GitHub, miễn phí và dựa trên giấy phép MIT mà không có bất kỳ hình thức thanh toán nào!

    Nếu bạn thấy dự án này hữu ích, hãy cho nó một sao trên GitHub, cảm ơn bạn!", "setBtSaveChat": "Chỉ lưu trò chuyện", "setBtSaveSys": "Lưu vào hệ thống", "wsrvClose": "Đóng wsrv", "wsrvOpen": "Mở wsrv", "temperature": "Ngẫu nhiên", "temperatureInfo": "Khi giá trị (temperature) tăng, các phản hồi trở nên ngẫu nhiên hơn", "top_p": "Lấy Mẫu Xác Suất Cao Nhất", "top_pInfo": "(top_p) tương tự như ngẫu nhiên nhưng không nên thay đổi cùng với nhiệt độ", "presence_penalty": "Sự Tươi Mới của Chủ đề", "presence_penaltyInfo": "Khi giá trị (presence_penalty) tăng, có khả năng mở rộng đến các chủ đề mới cao hơn", "frequency_penalty": "Hình Phạt Tần Số", "frequency_penaltyInfo": "Khi giá trị (frequency_penalty) tăng, có khả năng giảm sự lặp lại của các từ nhiều hơn" ,"tts_voice": "Nhân vật giọng TTS", "typing": "Đang nhập", "authErro": "Xác thực không thành công", "authBt": "Vui lòng nhập lại mật khẩu truy cập xác thực", "micWhisper": "Nhận diện giọng nói thì thầm", "micAsr": "Nhận diện ngay lập tức", "micRec": "Bắt đầu ghi âm, vui lòng nói chuyện! Sẽ tự động dừng nếu không có âm thanh trong vòng 2 giây.", "micRecEnd": "Ghi âm đã kết thúc", subtle: 'Cao độ phân giải cao gấp 2 lần' ,creative: 'Cao độ phân giải cao gấp 2 lần. Sáng tạo' ,gpt_gx: 'GPTs sử dụng g-*', "ideoabout": "Về Ideogram", "ideoserver": "Máy chủ Ideogram", "ideokeyPlaceholder": "Khóa API cho Ideogram (tùy chọn)", "ideopls": "Gợi ý mô tả hình ảnh", "nohead": "Không bao gồm", klingabout: 'Liên quan đến Kling', klingserver: 'Địa chỉ API Kling', klingkeyPlaceholder: 'API Key Kling (tùy chọn)', klingkey: 'Khóa Kling', mode: 'Chế độ', duration: 'Thời gian', negative_prompt: 'Đặt văn bản không có đối tượng ở đây', std: 'Hiệu suất cao', pro: 'Chất lượng cao', needImg: 'Vui lòng tải lên hình ảnh tham khảo để nó có hiệu lực!', seed: 'Số hạt 1~2147483647', klingInfo: 'Mô tả:

  • 1. Chất lượng cao gấp 3,5 lần giá
  • 2. 10 giây gấp 2 lần giá
  • 3. Khung cuối cùng phải có hình ảnh tham khảo để có hiệu lực
  • ' ,"camera_type": "Ống kính", "cnull": "Ghép thông minh", "down_back": "Di chuyển xuống và thu nhỏ", "forward_up": "Đẩy tới và di chuyển lên", "right_turn_forward": "Quay phải và đẩy tới", "left_turn_forward": "Quay trái và đẩy tới" ,kling:'Kling' ,rttab: 'Giọng nói', rtinfo: 'Dịch vụ hội thoại giọng nói thời gian thực (realtime)', rtsetting: 'Vui lòng thiết lập máy chủ. Hiện tại, Realtime chỉ hỗ trợ dịch vụ từ xa; nếu cần dịch vụ cục bộ, vui lòng liên hệ với tác giả.', rjcloded: 'Kết nối đã bị ngắt', checkkey: 'Vui lòng kiểm tra xem API key có chính xác không', rtsuccess: 'Kết nối bình thường, duy trì cuộc gọi', rtservererror: 'Lỗi kết nối máy chủ WebSocket!', rtservererror2: 'Không hỗ trợ ghi âm, có thể do thiết bị!', rtconecting: 'Đang kết nối đến máy chủ', "confirmDelete": "Bạn có chắc chắn muốn xóa không?", "pikaabout": "Về Pika", "pikaserver": "Địa chỉ API Pika", "pikakeyPlaceholder": "Khóa API Pika (tùy chọn)", "createFail": "Tạo không thành công", "selecteff": "Hiệu ứng tham khảo", "udioabout": "Về Udio", "udiokeyPlaceholder": "API Key Udio (tùy chọn)", "udioserver": "Địa chỉ API Udio", "ud_prompt": "Gợi ý", "ud_prompt_pls": "Gợi ý: Mô tả, Phong cách", "ud_ly_write": "Lời bài hát tùy chỉnh", "ud_ly_auto": "Lời bài hát thông minh", "ud_ly_null": "Nhạc không lời", "ud_v32": "Giá cả phải chăng", "ud_v130": "Thời gian dài", "ud_info": "Lưu ý:
    • 1. Udio-32 có thời gian ngắn
    • 2. Udio-130 có giá gấp đôi Udio-32
    • 3. Gợi ý có thể bao gồm phong cách, mô tả, v.v.
    ", "ud_fail": "Không thể tạo bài hát này!", "ud_doing": "Không thể phát trong khi đang tạo", "ud_continuation": "Tiếp tục", "ud_precede": "Trước", "upImg2": "Tải lên hình ảnh
    Mô hình này hỗ trợ nhận diện hình ảnh
    Chú ý: sẽ có phí hình ảnh bổ sung
    Định dạng: jpeg jpg png gif

    Hỗ trợ kéo và thả

    Tải lên MP3 MP4
    Sẽ tự động gọi mô hình whisper-1
    Định dạng bao gồm: mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "Chú ý:
    • 1. Phải có hình ảnh
    • 2. Mô hình chỉ có một gen3a_turbo
    • 3. Giá cho 10 giây gấp đôi giá cho 5 giây
    ", "rml_heng": "Chế độ ngang", "rml_shu": "Chế độ dọc", "pixabout": "Liên quan đến Pixverse", "pixkeyPlaceholder": "Khóa API Pixverse có thể để trống", "pixserver": "Địa chỉ API Pixverse", "pixinfo": " Mô tả:
    • 1. Dựa trên v3.5 360p thời gian 5s chế độ Normal
    • 2. v2.5 là 0.5 lần
    • 3. Thời gian 10s là 2 lần
    • 4. 540P là 1.5 lần, 720P là 2 lần, 1080P là 4 lần
    • 5. Chế độ hiệu suất là 2 lần
    • 6. Các bội số được nhân với nhau, ví dụ 720P thời gian 10s là 2*2 tức là 4 lần, nếu thêm hiệu suất thì sẽ là 8 lần
    ", "riffabout": "Về Riffusion", "riffkeyPlaceholder": "Khóa API Riffusion (không bắt buộc)", "riffserver": "Địa chỉ API Riffusion", "riffinfo": "Mô tả", "editImage": "Chỉnh sửa hình ảnh", "editVideo": "Hình ảnh thành video", "moreset": "Thêm tham số", }, "mjset": { "server": "Máy chủ", "about": "Về", "model": "Mô hình", "sysname": "Trí tuệ nhân tạo vẽ" }, "mjtab": { "chat": "nói", "draw": "Vẽ", "drawinfo": "Vẽ trí tuệ nhân tạo Midjourney", "gallery": "sách", "galleryInfo": "Phòng trưng bày của tôi" }, "mjchat": { "loading": "Đang tải hình ảnh", "openurl": "Mở liên kết trực tiếp", "failReason": "Lý do thất bại:", "reload": "Tải lại", "progress": "Tiến triển:", "wait": "Nhiệm vụ đã được gửi, vui lòng đợi...", "reroll": "Vẽ lại", "wait2": "Nhiệm vụ {id} đã được gửi, vui lòng đợi", "redrawEditing": "Chỉnh sửa vẽ lại", "face": "Thay đổi khuôn mặt", "blend": "Trộn ảnh", "draw": "Vẽ", "submiting": "Đang gửi", "submit": "Gửi", "wait3": "Vui lòng không tắt! Đang tạo ảnh...", "success": "Lưu thành công", "successTitle": "Thành công", "modlePlaceholder": "Mô hình tùy chỉnh, cách nhau bằng khoảng trắng, không bắt buộc", "myModle": "Mô hình tùy chỉnh của tôi", "historyCnt": "Số ngữ cảnh", "historyToken": "Số ngữ cảnh nhiều hơn sẽ làm cho bộ nhớ chính xác hơn, nhưng sẽ tiêu tốn nhiều chi phí hơn", "historyTCnt": "Số câu trả lời", "historyTCntInfo": "Số câu trả lời càng nhiều, khả năng tiêu tốn chi phí càng cao", "role": "Đặt vai trò", "rolePlaceholder": "Đặt một vai trò riêng cho cuộc trò chuyện của bạn, không bắt buộc", "loading2": "Đang tải...", "loadmore": "Tải thêm", "nofind": "Không thể tìm thấy", "nofind2": "Nội dung liên quan không tìm thấy, bạn có thể thử những nội dung sau đây", "success2": "Chuyển đổi thành công!", "modelChange": "Thay đổi mô hình", "search": "Tìm kiếm", "searchPlaceholder": "Tên GPTs, giới thiệu", "attr": "Phụ kiện", "noproduct": "Phòng trưng bày chưa có sản phẩm của bạn", "myGallery": "Phòng trưng bày của tôi", "yourHead": "Ảnh đại diện của bạn", "your2Head": "Ảnh ngôi sao", "tipInfo": "Chú ý:
  • 1 Hình ảnh phải chứa khuôn mặt, nếu không sẽ không xuất hiện ảnh
  • 2 'Ảnh ngôi sao' có thể sử dụng MJ để vẽ trước
  • 3 'Ảnh ngôi sao' có thể là hình ảnh hoạt hình
  • 4 'Ảnh đại diện của bạn' nên sử dụng ảnh cá nhân 1 inch
  • ", "placeInput": "Vui lòng điền từ gợi ý!", "more5sb": "Tối đa tải lên 5 ảnh", "exSuccess": "Xuất thành công... Vui lòng kiểm tra thanh tải về", "downloadSave": "ai vẽ.txt", "noproducet": "Hiện chưa có sản phẩm chín thành", "imgBili": "Tỉ lệ ảnh", "imagEx": "Xuất liên kết hình ảnh tác phẩm", "prompt": "Từ gợi ý", "imgCYes": "Có ảnh nền", "imgCUpload": "Tự tải ảnh nền", "imgCInfo": "Thông tin ảnh nền:
    1. Ảnh nền có thể sử dụng ảnh cá nhân của bạn làm cơ sở để MJ vẽ hình
    2. Có thể sử dụng nhiều ảnh nền, tối đa 5 ảnh, mỗi ảnh không quá 1M", "imgCadd": "+ Thêm", "del": "Xóa", "img2text": "Hình thành văn", "img2textinfo": "Không biết cách đặt từ gợi ý? Hãy thử Hình thành văn!
    Gửi hình ảnh, nhận từ gợi ý", "traning": "Đang dịch...", "imgcreate": "Tạo ảnh", "imginfo": "Tham số khác:
  • 1 --no Bỏ qua --no, không xuất hiện xe trong hình ảnh
  • 2 --seed Có thể lấy hạt giống trước --seed 123456
  • 3 --chaos 10 Hỗn loạn (phạm vi: 0-100)
  • 4 --tile Fragmentation
  • ", "tStyle": "Phong cách", "tView": "Góc nhìn", "tShot": "Góc chụp người", "tLight": "Ánh sáng", "tQuality": "Chất lượng hình ảnh", "tStyles": "Mức độ nghệ thuật", "tVersion": "Phiên bản mô hình", "dalleInfo": "Chú ý:
  • 1 Dall-e là mô hình vẽ hình do OpenAI cung cấp
  • 2 Hình ảnh của OpenAI có thời gian sử dụng, hãy sao lưu đúng cách
  • 3 Lưu ý: Giá của hình ảnh 1790px là gấp đôi
  • ", "version": "Phiên bản", "size": "Kích thước", "blendInfo": "Chú ý:
  • 1 Kết hợp ít nhất 2 hình ảnh
  • 2 Tối đa có thể tải lên 6 hình ảnh
  • ", "blendStart": "Bắt đầu kết hợp", "no2add": "Vui lòng không thêm hình ảnh giống nhau", "add2more": "Vui lòng thêm ít nhất hai hình ảnh", "no1m": "Kích thước hình ảnh không quá 1M", "imgExt": "Chỉ hỗ trợ định dạng jpg, gif, png, jpeg cho hình ảnh", "setSync": "Đồng bộ hóa Midjourney và Suno", "addGPTS": "Thêm GPTs", "addPlaceholder": "Dán GID của GPTs vào đây hoặc dán trực tiếp liên kết của GPTs", "gidError": "Không tìm thấy GID hợp lệ, vui lòng điền lại", "success3": "Thêm GPTs thành công!" }, draw: { qualityList: { general: "General", clear: "Clear", hd: "HD", ultraHd: "Ultra HD", }, styleList: { cyberpunk: "Cyberpunk", star: "Star", anime: "Anime", japaneseComicsManga: "Japanese Comics/Manga", inkWashPaintingStyle: "Ink Wash Painting Style", original: "Original", landscape: "Landscape", illustration: "Illustration", manga: "Manga", modernOrganic: "Modern Organic", genesis: "Genesis", posterstyle: "Poster Style", surrealism: "Surrealism", sketch: "Sketch", realism: "Realism", watercolorPainting: "Watercolor Painting", cubism: "Cubism", blackAndWhite: "Black and White", fmPhotography: "Film Photography Style", cinematic: "Cinematic", clearFacialFeatures: "Clear Facial Features", }, viewList: { wideView: "Wide View", birdView: "Bird's Eye View", topView: "Top View", upview: "Upview", frontView: "Front View", headshot: "Headshot", ultrawideshot: "Ultrawide Shot", mediumShot: "Medium Shot (MS)", longShot: "Long Shot (LS)", depthOfField: "Depth of Field (DOF)", }, shotList: { faceShot: "Face Shot (VCU)", bigCloseUp: "Big Close-Up (BCU)", closeUp: "Close-Up (CU)", waistShot: "Waist Shot (WS)", kneeShot: "Knee Shot (KS)", fullLengthShot: "Full Length Shot (FLS)", extraLongShot: "Extra Long Shot (ELS)", }, stylesList: { styleLow: "Style Low", styleMed: "Style Medium", styleHigh: "Style High", styleVeryHigh: "Style Very High", }, lightList: { coldLight: "Cold Light", warmLight: "Warm Light", hardLighting: "Hard Lighting", dramaticLight: "Dramatic Light", reflectionLight: "Reflection Light", mistyFoggy: "Misty/Foggy", naturalLight: "Natural Light", sunLight: "Sun Light", moody: "Moody", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney Bot", nijiJourney: "Niji Journey", }, dimensionsList: { square: "Square (1:1)", portrait: "Portrait (2:3)", landscape: "Landscape (3:2)", }, } ,suno:{ "description": "Chế độ mô tả", "custom": "Chế độ chuyên nghiệp", "style": "Phong cách bài hát", "stylepls": "Tên bài hát, ví dụ: Nhạc Pop", "emputy": "Không có nội dung", "noly": "Không có lời bài hát", "inputly": "Vui lòng nhập tên bài hát hoặc lời bài hát", "doingly": "Đang tiến hành, vui lòng đợi.", "doingly2": "Đang lấy lời bài hát...", "title": "Tên bài hát", "titlepls": "Tên bài hát, ví dụ: Kỳ nghỉ", "desc": "Mô tả bài hát", "descpls": "Mô tả bài hát, ví dụ: Nhạc pop gốc về kỳ nghỉ", "noneedly": "Không cần lời bài hát", "rank": "Lựa chọn ngẫu nhiên", "ly": "Lời bài hát", "lypls": "Lời bài hát: với một định dạng nhất định", "generate": "Sáng tác bài hát", "generately": "Tạo lời bài hát", "nodata": "Vui lòng sáng tạo trước để có danh sách bài hát", "menu": "Âm nhạc", "menuinfo": "Sáng tạo âm nhạc Suno", "server": "Điểm cuối API Suno", "serverabout": "Liên quan đến Suno", "setOpenKeyPlaceholder": "Khóa liên quan cho API Suno; tùy chọn", upMps: 'Tải lên âm thanh', extend: 'Mở rộng', extendFrom: 'Mở rộng từ', extendAt: 'Bắt đầu mở rộng từ', fail: 'Thất bại', info: 'Hướng dẫn:
    Thời lượng tải lên âm thanh phải từ 6 giây đến 60 giây' } ,video:{ "menu": "Video", "menuinfo": "Tạo video Luma và các video khác", "descpls": "Mô tả tạo video", "lumaabout": "Về Luma", "lumaserver": "Địa chỉ API Luma", "setOpenKeyPlaceholder": "Khóa API Luma, không bắt buộc", "generate": "Tạo video", "nodata": "Không có video có sẵn, vui lòng tạo trước!", "selectimg": "Chọn ảnh", "clear": "Xóa", "plsInput": "Vui lòng nhập nội dung!", "submitSuccess": "Đã gửi thành công!", "process": "Đang tạo video...", "repeat": "Thử lại", "lumainfo": "Giải thích:
    • 1. Video demo Pro và relax có liên kết có watermark.
    • 2. Phiên bản Pro không có watermark cần phải lấy liên kết tải xuống qua nút 'Tải về'.
    • 3. Các liên kết phiên bản Pro có thời hạn; vui lòng lưu trữ tập tin MP4 vào máy cục bộ kịp thời.
    • 4. Đối với phiên bản Pro, lưu tập tin MP4 vào máy cục bộ trong vòng 30 phút sau khi tạo ra, vì kênh có thể bị chặn hoặc ngừng hoạt động.
    • 5. Nếu liên kết tải xuống cho phiên bản Pro không hợp lệ, sẽ cung cấp liên kết video có watermark.
    ", "runwayabout": "Liên quan đến Runway", "runwayserver": "Địa chỉ API Runway", "setOpenKeyPlaceholder2": "Khóa API Runway, không bắt buộc", "endImg": "Hình cuối", "runwayinfo": "Giải thích:
    • 1. Các hình ảnh và video của Runway có thời hạn.
    • 2. Vui lòng lưu trữ tập tin MP4 vào máy cục bộ trong vòng 30 phút sau khi tạo video.
    ", "nosup": "Tạm thời không hỗ trợ", "rwgen2": "Phiên bản: Gen-2, hiệu quả chi phí", "rwgen3": "Phiên bản: Gen-3 Alpha", "repeat2":"Expired.Reget" } ,dance:{ menu: "Nhảy múa", menuinfo: "Tạo video nhảy múa với Viggle và các dịch vụ khác.", character: "Nhân vật", viggleabout: "Thông tin về Viggle", viggleserver: "Địa chỉ API của Viggle", setOpenKeyPlaceholder: "Khóa API của Viggle, không bắt buộc", info: "Hướng dẫn:
    1. Hình ảnh nhân vật nên là ảnh toàn thân.
    2. Video mẫu nhảy múa nên là video cá nhân, không phải là nhóm nhảy.", model: "Mẫu", bgw: "Nền trắng", bgg: "Nền xanh lá", bgmoban: "Nền mẫu", bgrole: "Nền nhân vật", gring: "Đang tạo...", uprolefirst: "Vui lòng tải ảnh nhân vật lên trước", uprolefail: "Tải lên thất bại", upvideo: "+ Tải lên Video mẫu nhảy múa", usevideo: "+ Sử dụng Mẫu chính thức", moban: "Mẫu nhảy múa", moban2: "Tên mẫu", use: "Sử dụng" } } ================================================ FILE: src/locales/zh-CN.ts ================================================ export default { common: { add: '添加', addSuccess: '添加成功', edit: '编辑', editSuccess: '编辑成功', delete: '删除', deleteSuccess: '删除成功', save: '保存', saveSuccess: '保存成功', reset: '重置', action: '操作', export: '导出', exportSuccess: '导出成功', import: '导入', importSuccess: '导入成功', hide: '隐藏', clear: '清空', clearSuccess: '清空成功', yes: '是', no: '否', confirm: '确定', download: '下载', noData: '暂无数据', wrong: '好像出错了,请稍后再试。', success: '操作成功', failed: '操作失败', verify: '验证', unauthorizedTips: '未经授权,请先进行验证。', stopResponding: '停止响应', }, chat: { newChatButton: '新建聊天', //placeholder: '来说点什么吧...(Shift + Enter = 换行,"/" 触发提示词)', placeholder: '可输入说点什么,也可贴截图或拖拽文件(Shift + Enter = 换行,"/" 触发提示词)', placeholderMobile: '来说点什么...', copy: '复制', copied: '复制成功', copyCode: '复制代码', clearChat: '清空会话', clearChatConfirm: '是否清空会话?', exportImage: '保存会话到图片', exportImageConfirm: '是否将会话保存为图片?', exportSuccess: '保存成功', exportFailed: '保存失败', usingContext: '上下文模式', turnOnContext: '当前模式下, 发送消息会携带之前的聊天记录', turnOffContext: '当前模式下, 发送消息不会携带之前的聊天记录', deleteMessage: '删除消息', deleteMessageConfirm: '是否删除此消息?', deleteHistoryConfirm: '确定删除此记录?', clearHistoryConfirm: '确定清空记录?', preview: '预览', showRawText: '显示原文', }, setting: { setting: '设置', general: '总览', advanced: '高级', config: '配置', avatarLink: '头像链接', name: '名称', description: '描述', backgroundImage: '背景图片', role: '角色设定', temperature: 'Temperature', top_p: 'Top_p', resetUserInfo: '重置用户信息', chatHistory: '聊天记录', theme: '主题', language: '语言', webdavSync: 'WebDAV 同步', webdavConfig: '配置', webdavUrl: 'WebDAV 地址', webdavUsername: '用户名', webdavPassword: '密码', webdavConfigError: '请填写完整的 WebDAV 配置', webdavNotConfigured: '请先配置 WebDAV', webdavSyncSuccess: '同步成功', webdavSyncError: '同步失败', webdavTest: '测试连接', webdavUpload: '上传', webdavDownload: '下载', api: 'API', reverseProxy: '反向代理', timeout: '超时', socks: 'Socks', httpsProxy: 'HTTPS Proxy', balance: 'API余额', monthlyUsage: '本月使用量', }, store: { siderButton: '提示词商店', local: '本地', online: '在线', title: '标题', description: '描述', clearStoreConfirm: '是否清空数据?', importPlaceholder: '请粘贴 JSON 数据到此处', addRepeatTitleTips: '标题重复,请重新输入', addRepeatContentTips: '内容重复:{msg},请重新输入', editRepeatTitleTips: '标题冲突,请重新修改', editRepeatContentTips: '内容冲突{msg} ,请重新修改', importError: '键值不匹配', importRepeatTitle: '标题重复跳过:{msg}', importRepeatContent: '内容重复跳过:{msg}', onlineImportWarning: '注意:请检查 JSON 文件来源!', downloadError: '请检查网络状态与 JSON 文件有效性', }, mjset:{ server:'服务端' ,about:'关于' ,model:'模型' ,sysname:'AI绘图' } ,mjtab:{ chat:'对话' ,draw:'绘画' ,drawinfo:'AI绘画 Midjourney引擎' ,gallery:'画廊' ,galleryInfo:'我的画廊' } ,mjchat:{ loading:'正在载入图片' ,openurl:'直接打开链接' ,failReason:'失败原因:' ,reload:'重新获取' ,progress:'进度:' ,wait:'任务已经提交请等待...' ,reroll:'重绘' ,wait2:'任务 {id} 已经提交请等待' ,redrawEditing:'局部重绘编辑' ,face:'换脸' ,blend:'混图' ,draw:'绘图' ,submiting:'提交中' ,submit:'提交' ,wait3:'请勿关闭! 图片生成中...' ,success:'保存成功' ,successTitle:'成功' ,modlePlaceholder:'自定义模型多个用空格隔开,不是必须' ,myModle:'自定义模型' ,historyCnt:'上下文数量' ,historyToken:'更多的上下文会使记忆更精确,但会消耗更多的额度' ,historyTCnt:'回复数' ,historyTCntInfo:'(max_tokens)回复数越大 ,越有可能消耗更多的额度' ,role:'角色设定' ,rolePlaceholder:'给你的会话设置一个专属的角色,不是必须' ,loading2:'正在加载...' ,loadmore:'加载更多' ,nofind:'未能找到' ,nofind2:'相关内容, 你可尝试以下内容' ,success2:'切换成功!' ,modelChange:'模型切换' ,search:'搜索' ,searchPlaceholder:'GPTs名字、介绍' ,attr:'附件' ,noproduct:'画廊还没有您的作品' ,myGallery:'我的画廊' ,yourHead:'你的头像' ,your2Head:'明星图' ,tipInfo:'说明:
  • 1 图片都必须包含脸,否则出不来图
  • 2 “明星图”可以先用mj绘画制作出来
  • 3 “明星图”其实动漫图也行
  • 4 “你的头像”建议用一寸个人照
  • ' ,placeInput: '请填写提示词!' ,more5sb: '最多上传5张图片' ,exSuccess: '导出成功... 请看下载栏' ,downloadSave: "ai绘画.txt" ,noproducet: "暂时没成熟作品" ,imgBili:'图片比例' ,imagEx:'作品图片链接导出' ,prompt:'提示词' ,imgCYes:'含有垫图' ,imgCUpload:'自传垫图' ,imgCInfo:'垫图说明:
    1.垫图可使用自己的图片作为基础,让MJ来绘图
    2.可以使用多张垫图 最多5张, 单张图片不超过1M
    ' ,imgCadd:'+添加' ,del:'删除' ,img2text:'图生文' ,img2textinfo:'不知如何写提示词?用图生文试试!
    提交图片,出提示词' ,traning:'翻译中...' ,imgcreate:'生成图片' ,imginfo:'其他参数:
  • 1 --no 忽略 --no car 图中不出现车
  • 2 --seed 可先获取种子 --seed 123456
  • 3 --chaos 10 混合(范围:0-100)
  • 4 --tile 碎片化
  • 5 --cw 0 只参考五官, 100 参考五官、头发、服装等
  • ' ,tStyle:'风格' ,tView:'视角' ,tShot:'人物镜头' ,tLight:'灯光' ,tQuality:'画质' ,tStyles:'艺术程度' ,tVersion:'模型版本' ,dalleInfo:' 说明:
  • 1 dall-e 是openAi提供的画图模型
  • 2 openAi的图片有时效性,请做好备份
  • 3 注意:1790px的图片价格是双倍
  • 4 注意:dall-e-2、gpt-image-1 支持多图参考
  • ' ,version:'版本' ,size:'尺寸' ,blendInfo:'说明:
  • 1 合成至少2张图片
  • 2 最多可传6张图
  • ' ,blendStart:'开始合成' ,no2add:'请勿重复添加图片' ,add2more:'请添加两张以上图片' ,no1m:'图片大小不能超过{m}M' ,imgExt:'图片仅支持jpg,gif,png,jpeg格式' ,setSync:'同步Midjourney、Suno设置' ,addGPTS:'新增GPTs' ,addPlaceholder:'将GPTs的gid贴这儿 也可直接贴gpts的链接' ,gidError:'未找到有效的gid,请重新填写' ,success3:'新增GPTs成功!' }, mj:{ setOpen:'OpenAI 相关', setOpenPlaceholder:'必须包含 http(s)://' ,setOpenUrl:'OpenAI接口地址' ,setOpenKeyPlaceholder:'使用自定义 OpenAI Key 绕过密码访问限制' ,setMj:'Midjourney 相关' ,setMjUrl:'Midjourney接口地址:' ,setMjKeyPlaceholder:'使用自定义 Api Secret 绕过密码访问限制' ,setUploader:'上传相关' ,setUploaderUrl:'上传地址:' ,setBtSave:'保存' ,setBtBack:'恢复默认' , redraw:'局部重绘' ,fail1:'客官不要太急嘛,正在加载呢' ,success1:'图片刷新成功!' ,high_variation:'强变化' ,low_variation:'弱变化' ,p15:'变焦1.5倍' ,p20:'变焦2倍' ,p100:'方正' ,retry:'重分析' ,pan_left:'向左' ,pan_right:'向右' ,pan_up:'向上' ,pan_down:'向下' ,up2:'高清2倍' ,up4:'高清4倍', thinking:'思考中...' ,noReUpload:'不能重复上传' ,uploading:'上传中...' ,uploadSuccess:'上传成功' ,uploadFail:'上传失败:' ,upPdf:'上传图片、附件
    能上传图片、PDF、EXCEL等文档

    支持拖拽

    ' ,upImg:'上传图片
    会自动调用 gpt-4-vision-preview 模型
    注意:会有额外的图片费用
    格式: jpeg jpg png gif

    支持拖拽

    上传MP3 MP4
    会自动直接调用 whisper-1 模型
    格式有:mp3 mp4 mpeg mpga m4a wav webm

    ' ,clearAll:'清参数' ,czoom:'自定义' ,customTitle:'自定义变焦' ,zoominfo:'修改zoom值,范围在 1.0~2.0 默认设置为1.8', modleSuccess:'模型加载成功' ,setingSuccess:'设置成功' ,tokenInfo1:'剩余Tokens = 模型长度 - 角色设定 - 上下文(会话历史) - 回复数 - 当前输入' ,tokenInfo2:'角色设定留空,系统会给一个默认的' ,noSuppertModel:'刷新,暂不支持此模型!' ,failOcr:'识别失败' ,remain:'剩:' ,totalUsage:'订阅总额' ,disableGpt4:'已禁用GPT4' ,setTextInfo:'OpenAi Api Key 错误,点击这里重新' ,attr1:'附' ,ulink:'原图链接' ,copyFail:'复制失败' ,tts:'TTS 文本转语音' ,fail:'发生错误' ,noSupperChrom:'浏览器不支持!' ,lang:'语音' ,ttsLoading:'语音转化...' ,ttsSuccess:'转化成功' ,micIng:'正在录音,说点什么...' ,mStart:'开始' ,mPause:'暂停' ,mGoon:'继续' ,mRecord:'重录' ,mPlay:'播放' ,mCanel:'取消' ,mSent:'发送' ,findVersion:'发现更新版本' ,yesLastVersion:'已是最新版本' ,infoStar:'此项目开源于 GitHub ,免费且基于 MIT 协议,没有任何形式的付费行为!

    如果你觉得此项目对你有帮助,请在 GitHub 帮我点个 Star,谢谢!' ,setBtSaveChat:'仅保存会话' ,setBtSaveSys: '保存至系统' ,wsrvClose:'关闭 wsrv' ,wsrvOpen:'开启 wsrv' ,temperature:'随机性' ,temperatureInfo:'(temperature)值越大,回复越随机' ,top_p:'核采样' ,top_pInfo:'(top_p)与随机性类似,但不要和随机性一起更改 ' ,presence_penalty:'话题新鲜度 ' ,presence_penaltyInfo:'(presence_penalty)值越大,越有可能扩展到新话题' ,frequency_penalty:'频率惩罚度' ,frequency_penaltyInfo:' (frequency_penalty)值越大,越有可能降低重复字词' ,tts_voice:'TTS 语音人物' ,typing:'正在输入' ,authErro:'授权失败' ,authBt:'请重新输入授权访问密码' ,micWhisper:'Whisper语音识别' ,micAsr:'即时识别' ,micRec:'开始录音,请说话!2秒内无声音将自动关闭' ,micRecEnd:'录音已结束' ,subtle:'高清2倍' ,creative:'高清2倍.创意' ,gpt_gx:'GPTs用g-*' ,ideoabout:'Ideogram 相关' ,ideoserver:'Ideogram 接口地址' ,ideokeyPlaceholder:'Ideogram 的API Key 可不填' ,ideopls:'图片描述 提示词' ,nohead:'不含' ,klingabout:'可灵 相关' ,klingserver:'可灵 接口地址' ,klingkeyPlaceholder:'可灵 的API Key 可不填' ,klingkey:'可灵 Key' ,mode:'模式' ,duration:'时长' ,negative_prompt:'不含物体的文字放这儿' ,std:'高性能' ,pro:'高表现' ,needImg:'请传参考图才生效!' ,seed:'种子数字 1~2147483647' ,klingInfo:'说明:

  • 1. 高表现是3.5倍的价格
  • 2. 10s是2倍的价格
  • 3. 尾帧必须有参考图片才生效
  • 4. v1.5 v1.6的价格都是v1.0的2倍
  • 5. v2-master的价格都是v1.0的10倍
  • ' ,camera_type:'镜头' ,cnull:'智能匹配' ,down_back: '下移拉远' ,forward_up: '推进上移' ,right_turn_forward: '右旋推进' ,left_turn_forward: '左旋推进' ,kling:'可灵' ,rttab:'语音' ,rtinfo:'实时语音对话服务(realtime)' ,rtsetting:'请设置服务端,目前Realtime 仅支持远程服务;需本地服务请联系作者' ,rjcloded:'连接已断开' ,checkkey:'请检查 api key 是否正确' ,rtsuccess:'连接正常保持通话' ,rtservererror:'websocket 连接服务器错误!' ,rtservererror2:'不支持录音,可能是设备原因!' ,rtconecting:'正在连接服务器' ,confirmDelete:'确认要删除?' ,pikaabout:'Pika 相关' ,pikaserver:'Pika 接口地址' ,pikakeyPlaceholder:'Pika 的API Key 可不填' ,createFail:'生成失败' ,selecteff:'参考效果' ,udioabout:'Udio 相关' ,udiokeyPlaceholder:'Udio 的API Key 可不填' ,udioserver:'Udio 接口地址' ,ud_prompt:'提示词' ,ud_prompt_pls:'提示词: 描述、曲风' ,ud_ly_write:'自定义歌词' ,ud_ly_auto:'智能歌词' ,ud_ly_null:'纯音乐' ,ud_v32:'实惠' ,ud_v130:'时间长' ,ud_info:'注意:
    • 1.udio-32 时长短
    • 2.udio-130 价格是udio-32的2倍
    • 3.提示词内可以放风格、描述等
    ' ,ud_fail:"这首歌生成失败!" ,ud_doing:"生成中无法播放" ,ud_continuation:"后扩展" ,ud_precede:"前扩展" ,upImg2:'上传图片
    该模型支持识图
    注意:会有额外的图片费用
    格式: jpeg jpg png gif

    支持拖拽

    上传MP3 MP4
    会自动直接调用 whisper-1 模型
    格式有:mp3 mp4 mpeg mpga m4a wav webm

    ' ,rml_info:'注意:
    • 1.必须带图
    • 2.模型支持 gen3a_turbo、gen4_turbo
    • 3.10s的价格是5s的双倍
    • 4.gen4_turbo 支持的ratio 比例类型更多
    ' ,rml_heng:'横屏' ,rml_shu:'竖屏' ,pixabout:'Pixverse 相关' ,pixkeyPlaceholder:'Pixverse 的API Key 可不填' ,pixserver:'Pixverse 接口地址' ,pixinfo:' 说明:
    • 1.以v3.5 360p 时长5s 模式 Normal 为基数
    • 2.支持v4 v3.5 低版本不再支持
    • 3.时长8s 是 2倍
    • 4.540P 1.5倍 720P 2倍 1080P 4倍
    • 5.模式 performance 2倍
    • 6.倍数是相乘的 比如 720P 时长8s 那就是 2*2是4倍,如果再加performance 就是8倍
    ' ,server_load:'服务端获取' ,model_select:'模型选择' ,riffabout:'Riffusion 相关' ,riffkeyPlaceholder:'Riffusion 的API Key 可不填' ,riffserver:'Riffusion 接口地址' ,riffinfo:'说明' ,editImage:'图片编辑' ,editVideo:'图生视频' ,moreset:'更多参数' }, draw: { qualityList: { general: "一般", clear: "清晰", hd: "高清", ultraHd: "超高清", }, styleList: { cyberpunk: "赛博朋克", star: "星际", anime: "动漫", japaneseComicsManga: "日本漫画", inkWashPaintingStyle: "水墨画风格", original: "原创", landscape: "风景画", illustration: "插画", manga: "漫画", modernOrganic: "现代自然", genesis: "创世纪", posterstyle: "海报风格", surrealism: "超现实主义", sketch: "素描", realism: "写实", watercolorPainting: "水彩画", cubism: "立体主义", blackAndWhite: "黑白", fmPhotography: "胶片摄影风格", cinematic: "电影化", clearFacialFeatures: "清晰的面部特征", }, viewList: { wideView: "宽视角", birdView: "鸟瞰视角", topView: "顶视角", upview: "仰视角", frontView: "正面视角", headshot: "头部特写", ultrawideshot: "超广角视角", mediumShot: "中景", longShot: "远景", depthOfField: "景深", }, shotList: { faceShot: "脸部特写", bigCloseUp: "大特写", closeUp: "特写", waistShot: "腰部以上", kneeShot: "膝盖以上", fullLengthShot: "全身照", extraLongShot: "极远景", }, stylesList: { styleLow: "低强度风格", styleMed: "中等强度风格", styleHigh: "高强度风格", styleVeryHigh: "非常高强度风格", }, lightList: { coldLight: "冷光", warmLight: "暖光", hardLighting: "硬光", dramaticLight: "戏剧性光线", reflectionLight: "反射光", mistyFoggy: "薄雾", naturalLight: "自然光", sunLight: "阳光", moody: "情绪化", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney 机器人", nijiJourney: "Niji Journey", }, dimensionsList: { square: "正方形 (1:1)", portrait: "肖像 (2:3)", landscape: "风景 (3:2)", }, } ,suno:{ description:"描述模式" ,custom:"定制模式" ,style:'歌曲风格' ,stylepls:'歌曲名称比如:流行音乐' ,emputy:'暂无内容' ,noly:'无歌词' ,inputly:'请输入歌曲名称或歌词' ,doingly:"正在执行请稍后." ,doingly2: "正在获取歌词..." ,title:'歌曲名称' ,titlepls:'歌曲名称比如:假期' ,desc:'歌曲描述' ,descpls:'歌曲描述 比如:关于假期的原声流行音乐' ,noneedly:'无需歌词' ,rank:'随机获取' ,ly:'歌词' ,lypls:'歌词:有一定的格式' ,generate:'创作歌曲' ,generately:'生成歌词' ,nodata:'请先创作才有歌曲列表' ,menu:'音乐' ,menuinfo:'Suno、Udio等音乐创作' ,server:'Suno 接口地址' ,serverabout:'Suno 相关' ,setOpenKeyPlaceholder:'Suno API 的相关KEY;可不填' ,upMps:'上传音频' ,extend:'延伸' ,extendFrom:'延伸于' ,extendAt:'延伸开始于' ,fail:'失败' ,info:'说明:
    上传音频时长必须在6s-60s内' ,lyricsFail:'获取歌曲失败' } ,video:{ menu:"视频", menuinfo:'Veo 可灵 pixverse等 视频创作', descpls:'视频创作描述', lumaabout:"Luma 相关", lumaserver:"Luma 接口地址", setOpenKeyPlaceholder:'Luma API 的key, 可不填', generate:'生成视频', nodata:'暂无可用视频,请先生成!', selectimg:'参考图片', clear:'清除', plsInput:'请输入内容!', submitSuccess:'已提交成功!', process:'视频生成中...', repeat:'重新获取', pending:'状态:队列中', processing:'状态:生产中', failed:'状态:生成失败!', download:'下载', extend:'延展', lumainfo:'说明:
    • 1.relax版已下线,入口已经更换到pro无水印版
    • 2.无水印版本需要通过“下载按钮”得到下载链接
    • 3.pro得到的链接有时限;请及时保存mp4文件到本地
    • 4.请在生成后的30分钟内;将mp4保存到本地,渠道号也可能被封或者下线
    • 5.当下载链接无效时会给出带水印的视频链接
    ', runwayabout:'Runway 相关', runwayserver:'Runway 接口地址', setOpenKeyPlaceholder2:'Runway API 的key, 可不填', endImg:'尾帧图', runwayinfo:'说明:
    • 1. Runway 图片与视频都有有效期
    • 2. 请在生成视频后30分钟内将mp4保存到本地
    • 3. 过期重新获取,可能存在账号下线而获取失败
    • 4. Gen3A Turbo 必须带图或者视频
    • 5. 参考可以是图或者视频mp4
    ', nosup:'暂不支持', rwgen2:'版本: Gen-2, 价格实惠', rwgen3:'版本: Gen-3 Alpha', rwgen3fast:'版本: Gen-3 Alpha Fast', repeat2:'过期.重新获取', rwgen3turbo:'版本: Gen-3 Alpha Turbo', gen3a_turbo_img:'Gen-3 Alpha Turbo 必须带图' ,selectModel:'请选择模型' } ,dance:{ menu:"舞蹈", menuinfo:'Viggle等 舞蹈视频创作' ,character:'人物角色' ,viggleabout:"Viggle 相关", viggleserver:"Viggle 接口地址", setOpenKeyPlaceholder:'Viggle API 的key, 可不填', info:'说明:
    1.角色图片最好是个人全身照片
    2.舞蹈模版视频最好是个人视频 别传群舞
    3.生成会给出倍数价格 2电量 表示2倍的基础价格', model:'模型', bgw:'白色背景', bgg:'绿色背景', bgmoban:'模版背景', bgrole:'角色背景', gring:'生成中...', uprolefirst:'请先上传角色图片', uprolefail:'上传失败', upvideo:'+上传模版舞蹈视频', usevideo:'+使用官网模版', moban:'舞蹈模版', moban2:'模版名称', use:'使用', } } ================================================ FILE: src/locales/zh-TW.ts ================================================ export default { common: { add: '新增', addSuccess: '新增成功', edit: '編輯', editSuccess: '編輯成功', delete: '刪除', deleteSuccess: '刪除成功', save: '儲存', saveSuccess: '儲存成功', reset: '重設', action: '操作', export: '匯出', exportSuccess: '匯出成功', import: '匯入', importSuccess: '匯入成功', clear: '清除', clearSuccess: '清除成功', yes: '是', no: '否', confirm: '確認', download: '下載', noData: '目前無資料', wrong: '發生錯誤,請稍後再試。', success: '操作成功', failed: '操作失敗', verify: '驗證', unauthorizedTips: '未經授權,請先進行驗證。', stopResponding: '停止回應', }, chat: { newChatButton: '新增對話', //placeholder: '來說點什麼...(Shift + Enter = 換行,"/" 觸發提示詞)', placeholder: '可輸入說點什麼,也可貼截圖或拖拽檔案(Shift + Enter = 換行,"/" 觸發提示詞)', placeholderMobile: '來說點什麼...', copy: '複製', copied: '複製成功', copyCode: '複製代碼', clearChat: '清除對話', clearChatConfirm: '是否清空對話?', exportImage: '儲存對話為圖片', exportImageConfirm: '是否將對話儲存為圖片?', exportSuccess: '儲存成功', exportFailed: '儲存失敗', usingContext: '上下文模式', turnOnContext: '啟用上下文模式,在此模式下,發送訊息會包含之前的聊天記錄。', turnOffContext: '關閉上下文模式,在此模式下,發送訊息不會包含之前的聊天記錄。', deleteMessage: '刪除訊息', deleteMessageConfirm: '是否刪除此訊息?', deleteHistoryConfirm: '確定刪除此紀錄?', clearHistoryConfirm: '確定清除紀錄?', preview: '預覽', showRawText: '顯示原文', }, setting: { setting: '設定', general: '總覽', advanced: '進階', config: '設定', avatarLink: '頭貼連結', name: '名稱', description: '描述', backgroundImage: '背景圖片', role: '角色設定', temperature: 'Temperature', top_p: 'Top_p', resetUserInfo: '重設使用者資訊', chatHistory: '紀錄', theme: '主題', language: '語言', webdavSync: 'WebDAV 同步', webdavConfig: '配置', webdavUrl: 'WebDAV 地址', webdavUsername: '使用者名稱', webdavPassword: '密碼', webdavConfigError: '請填寫完整的 WebDAV 配置', webdavNotConfigured: '請先配置 WebDAV', webdavSyncSuccess: '同步成功', webdavSyncError: '同步失敗', webdavTest: '測試連接', webdavUpload: '上傳', webdavDownload: '下載', api: 'API', reverseProxy: '反向代理', timeout: '逾時', socks: 'Socks', httpsProxy: 'HTTPS Proxy', balance: 'API Credit 餘額', monthlyUsage: '本月使用量', }, store: { siderButton: '提示詞商店', local: '本機', online: '線上', title: '標題', description: '描述', clearStoreConfirm: '是否清除資料?', importPlaceholder: '請將 JSON 資料貼在此處', addRepeatTitleTips: '標題重複,請重新輸入', addRepeatContentTips: '內容重複:{msg},請重新輸入', editRepeatTitleTips: '標題衝突,請重新修改', editRepeatContentTips: '內容衝突{msg} ,請重新修改', importError: '鍵值不符合', importRepeatTitle: '因標題重複跳過:{msg}', importRepeatContent: '因內容重複跳過:{msg}', onlineImportWarning: '注意:請檢查 JSON 檔案來源!', downloadError: '請檢查網路狀態與 JSON 檔案有效性', }, "mj": { "setOpen": "OpenAI 相關", "setOpenPlaceholder": "必須包含 http(s)://", "setOpenUrl": "OpenAI接口地址", "setOpenKeyPlaceholder": "使用自定義 OpenAI Key 繞過密碼訪問限制", "setMj": "Midjourney 相關", "setMjUrl": "Midjourney接口地址:", "setMjKeyPlaceholder": "使用自定義 Api Secret 繞過密碼訪問限制", "setUploader": "上傳相關", "setUploaderUrl": "上傳地址:", "setBtSave": "保存", "setBtBack": "恢復默認", "redraw": "局部重繪", "fail1": "客官不要太急嘛,正在加載呢", "success1": "圖片刷新成功!", "high_variation": "強變化", "low_variation": "弱變化", "p15": "變焦1.5倍", "p20": "變焦2倍", "p100": "方正", "retry": "重分析", "pan_left": "向左", "pan_right": "向右", "pan_up": "向上", "pan_down": "向下", "up2": "高清2倍", "up4": "高清4倍", "thinking": "思考中...", "noReUpload": "不能重複上傳", "uploading": "上傳中...", "uploadSuccess": "上傳成功", "uploadFail": "上傳失敗:", "upPdf": "上傳圖片或附件
    可以上傳圖片、PDF、EXCEL等文檔

    支持拖放

    ", "upImg": "上傳圖片
    將自動調用 gpt-4-vision-preview 模型
    注意:可能會有額外的圖片費用
    格式:jpeg、jpg、png、gif

    支持拖放

    上傳MP3 MP4
    將自動直接調用 whisper-1 模型
    格式:mp3、mp4、mpeg、mpga、m4a、wav、webm

    ", "clearAll": "清參數", "czoom": "自定義", "customTitle": "自定義變焦", "zoominfo": "修改zoom值,範圍在 1.0 到 2.0,默认设置為1.8", "modleSuccess": "模型成功載入", "setingSuccess": "設定成功", "tokenInfo1": "剩餘Tokens = 模型長度 - 角色設定 - 上下文(對話歷史) - 回覆數 - 目前輸入", "tokenInfo2": "保持角色設定為空,系統將提供默認值。", "noSuppertModel": "刷新,目前不受此模型支持!", "failOcr": "識別失敗", "remain": "餘:", "totalUsage": "訂閱總額", "disableGpt4": "已禁用GPT4", "setTextInfo": "OpenAI API Key 錯誤,點擊這裡重新", "attr1": "附", "ulink": "原圖鏈接", "copyFail": "複製失敗", "tts": "文字轉語音", "fail": "發生錯誤", "noSupperChrom": "瀏覽器不支援!", "lang": "語音", "ttsLoading": "轉換中...", "ttsSuccess": "轉換成功", "micIng": "錄音中,請說些什麼...", "mStart": "開始", "mPause": "暫停", "mGoon": "繼續", "mRecord": "重新錄製", "mPlay": "播放", "mCanel": "取消", "mSent": "發送", "findVersion": "發現更新版本", "yesLastVersion": "已是最新版本", "infoStar": "此專案在 GitHub 上以 MIT 協議開源,免費且沒有任何付費行為!

    如果你覺得這個專案對你有幫助,請在 GitHub 上給它一顆星,謝謝!", "setBtSaveChat": "僅保存對話", "setBtSaveSys": "保存至系統", "wsrvClose": "關閉 wsrv", "wsrvOpen": "開啟 wsrv", "temperature": "隨機性", "temperatureInfo": "隨著 (temperature) 值的增加,回覆變得更隨機", "top_p": "概率抽樣", "top_pInfo": "(top_p) 類似於隨機性,但不應與溫度一同更改", "presence_penalty": "話題新鮮度", "presence_penaltyInfo": "隨著 (presence_penalty) 值的增加,擴展到新話題的機會更高", "frequency_penalty": "頻率懲罰", "frequency_penaltyInfo": "隨著 (frequency_penalty) 值的增加,降低重複字詞的可能性更高", "tts_voice": "TTS 語音角色", "typing": "正在輸入", "authErro": "授權失敗", "authBt": "請重新輸入授權訪問密碼", "micWhisper": "Whisper語音識別", "micAsr": "即時識別", "micRec": "開始錄音,請說話!2秒內無聲音將自動關閉", "micRecEnd": "錄音已結束", subtle: '高清2倍' ,creative: '高清2倍. 創意' ,gpt_gx: 'GPTs 用 g-*', "ideoabout": "有關 Ideogram", "ideoserver": "Ideogram 伺服器", "ideokeyPlaceholder": "Ideogram 的 API 金鑰(可選)", "ideopls": "圖片描述提示詞", "nohead": "不含", klingabout: '可靈 相關', klingserver: '可靈 接口地址', klingkeyPlaceholder: '可靈 的API Key 可不填', klingkey: '可靈 Key', mode: '模式', duration: '時長', negative_prompt: '不含物體的文字放這裡', std: '高性能', pro: '高表現', needImg: '請傳參考圖才生效!', seed: '種子數字 1~2147483647', klingInfo: '說明:

  • 1. 高表現是3.5倍的價格
  • 2. 10秒是2倍的價格
  • 3. 尾幀必須有參考圖片才生效
  • ' ,"camera_type": "鏡頭", "cnull": "智能配對", "down_back": "下移拉遠", "forward_up": "推進上移", "right_turn_forward": "右旋推進", "left_turn_forward": "左旋推進" ,kling:'可灵', rttab: '語音', rtinfo: '實時語音對話服務(realtime)', rtsetting: '請設置服務器,目前Realtime僅支持遠程服務;需本地服務請聯繫作者', rjcloded: '連接已斷開', checkkey: '請檢查api key是否正確', rtsuccess: '連接正常保持通話', rtservererror: 'websocket連接服務器錯誤!', rtservererror2: '不支持錄音,可能是設備原因!', rtconecting: '正在連接服務器', "confirmDelete": "確認要刪除?", "pikaabout": "Pika 相關", "pikaserver": "Pika 接口地址", "pikakeyPlaceholder": "Pika 的API Key 可不填", "createFail": "生成失敗", "selecteff": "參考效果", "udioabout": "關於 Udio", "udiokeyPlaceholder": "Udio API 金鑰(可選)", "udioserver": "Udio 接口地址", "ud_prompt": "提示詞", "ud_prompt_pls": "提示詞:描述、風格", "ud_ly_write": "自訂歌詞", "ud_ly_auto": "智能歌詞", "ud_ly_null": "純音樂", "ud_v32": "實惠", "ud_v130": "時間長", "ud_info": "注意:
    • 1. Udio-32 時長短
    • 2. Udio-130 價格是 Udio-32 的兩倍
    • 3. 提示詞內可以放風格、描述等
    ", "ud_fail": "這首歌生成失敗!", "ud_doing": "生成中無法播放", "ud_continuation": "後擴展", "ud_precede": "前擴展", "upImg2": "上載圖片
    該模型支持識圖
    注意:會有額外的圖片費用
    格式:jpeg jpg png gif

    支持拖曳

    上載MP3 MP4
    會自動直接調用 whisper-1 模型
    格式包括:mp3 mp4 mpeg mpga m4a wav webm

    ", "rml_info": "注意:
    • 1. 必須帶圖
    • 2. 模型只有一個 gen3a_turbo
    • 3. 10秒的價格是5秒的雙倍
    ", "rml_heng": "橫屏", "rml_shu": "豎屏", "pixabout": "與 Pixverse 相關", "pixkeyPlaceholder": "Pixverse 的 API 金鑰可不填", "pixserver": "Pixverse 接口地址", "pixinfo": " 說明:
    • 1.以 v3.5 360p 時長 5s 模式 Normal 為基數
    • 2.v2.5 是 0.5 倍
    • 3.時長 10s 是 2 倍
    • 4.540P 1.5 倍,720P 2 倍,1080P 4 倍
    • 5.模式 performance 2 倍
    • 6.倍數是相乘的,比如 720P 時長 10s 那就是 2*2 是 4 倍,如果再加 performance 就是 8 倍
    ", "riffabout": "關於 Riffusion", "riffkeyPlaceholder": "Riffusion API 金鑰(可選)", "riffserver": "Riffusion 接口地址", "riffinfo": "說明", "editImage": "圖片編輯", "editVideo": "圖生視頻", "moreset": "更多參數", }, "mjset": { "server": "服務端", "about": "關於", "model": "模型", "sysname": "AI繪圖" }, "mjtab": { "chat": "對話", "draw": "繪畫", "drawinfo": "AI繪畫 Midjourney引擎", "gallery": "畫廊", "galleryInfo": "我的畫廊" }, "mjchat": { "loading": "正在載入圖片", "openurl": "直接打開鏈接", "failReason": "失敗原因:", "reload": "重新獲取", "progress": "進度:", "wait": "任務已經提交請等待...", "reroll": "重繪", "wait2": "任務 {id} 已經提交請等待", "redrawEditing": "局部重繪編輯", "face": "換臉", "blend": "混圖", "draw": "繪圖", "submiting": "提交中", "submit": "提交", "wait3": "請勿關閉! 圖片生成中...", "success": "保存成功", "successTitle": "成功", "modlePlaceholder": "自定義模型多個用空格隔開,不是必須", "myModle": "自定義模型", "historyCnt": "上下文數量", "historyToken": "更多的上下文會使記憶更精確,但會消耗更多的額度", "historyTCnt": "回復數", "historyTCntInfo": "回復數越大 ,越有可能消耗更多的額度", "role": "角色設定", "rolePlaceholder": "給你的會話設置一個專屬的角色,不是必須", "loading2": "正在加載...", "loadmore": "加載更多", "nofind": "未能找到", "nofind2": "相關內容, 你可嘗試以下內容", "success2": "切換成功!", "modelChange": "模型切換", "search": "搜索", "searchPlaceholder": "GPTs名字、介紹", "attr": "附件", "noproduct": "畫廊還沒有您的作品", "myGallery": "我的畫廊", "yourHead": "你的頭像", "your2Head": "明星圖", "tipInfo": "說明:
  • 1 圖片都必須包含臉,否則出不來圖
  • 2 “明星圖”可以先用mj繪畫製作出來
  • 3 “明星圖”其實動漫圖也行
  • 4 “你的頭像”建議用一寸個人照
  • ", "placeInput": "請填寫提示詞!", "more5sb": "最多上傳5張圖片", "exSuccess": "導出成功... 請看下載欄", "downloadSave": "ai繪畫.txt", "noproducet": "暫時沒成熟作品", "imgBili": "圖片比例", "imagEx": "作品圖片鏈接導出", "prompt": "提示詞", "imgCYes": "含有墊圖", "imgCUpload": "自傳墊圖", "imgCInfo": "墊圖說明:
    1.墊圖可使用自己的圖片作為基礎,讓MJ來繪圖
    2.可以使用多張墊圖 最多5張, 單張圖片不超過1M
    ", "imgCadd": "+添加", "del": "刪除", "img2text": "圖生文", "img2textinfo": "不知如何寫提示詞?用圖生文試試!
    提交圖片,出提示詞", "traning": "翻譯中...", "imgcreate": "生成圖片", "imginfo": "其他參數:
  • 1 --no 忽略 --no car 圖中不出現車
  • 2 --seed 可先獲取種子 --seed 123456
  • 3 --chaos 10 混合(範圍:0-100)
  • 4 --tile 碎片化
  • ", "tStyle": "風格", "tView": "視角", "tShot": "人物鏡頭", "tLight": "燈光", "tQuality": "畫質", "tStyles": "藝術程度", "version": "版本", "size": "尺寸", "blendInfo": "說明:
  • 1 合成至少2張圖片
  • 2 最多可傳6張圖
  • ", "blendStart": "開始合成", "no2add": "請勿重複添加圖片", "add2more": "請添加兩張以上圖片", "no1m": "圖片大小不能超過1M", "imgExt": "圖片僅支持jpg,gif,png,jpeg格式", "setSync": "同步Midjourney和Suno", "addGPTS": "新增 GPTs", "addPlaceholder": "將 GPTs 的 gid 貼這裡 也可直接貼 GPTs 的鏈接", "gidError": "未找到有效的 gid,请重新填寫", "success3": "新增 GPTs 成功!" }, draw: { qualityList: { general: "一般", clear: "清晰", hd: "高清", ultraHd: "超高清", }, styleList: { cyberpunk: "賽博朋克", star: "星際", anime: "動漫", japaneseComicsManga: "日本漫畫", inkWashPaintingStyle: "水墨畫風格", original: "原創", landscape: "風景畫", illustration: "插畫", manga: "漫畫", modernOrganic: "現代自然", genesis: "創世紀", posterstyle: "海報風格", surrealism: "超現實主義", sketch: "素描", realism: "寫實", watercolorPainting: "水彩畫", cubism: "立體主義", blackAndWhite: "黑白", fmPhotography: "膠片攝影風格", cinematic: "電影化", clearFacialFeatures: "清晰的面部特徵", }, viewList: { wideView: "寬視角", birdView: "鳥瞰視角", topView: "頂視角", upview: "仰視角", frontView: "正面視角", headshot: "頭部特寫", ultrawideshot: "超廣角視角", mediumShot: "中景", longShot: "遠景", depthOfField: "景深", }, shotList: { faceShot: "臉部特寫", bigCloseUp: "大特寫", closeUp: "特寫", waistShot: "腰部以上", kneeShot: "膝蓋以上", fullLengthShot: "全身照", extraLongShot: "極遠景", }, stylesList: { styleLow: "低強度風格", styleMed: "中等強度風格", styleHigh: "高強度風格", styleVeryHigh: "非常高強度風格", }, lightList: { coldLight: "冷光", warmLight: "暖光", hardLighting: "硬光", dramaticLight: "戲劇性光線", reflectionLight: "反射光", mistyFoggy: "薄霧", naturalLight: "自然光", sunLight: "陽光", moody: "情緒化", }, versionList: { mjV6: "MJ V6", mjV61: "MJ V6.1", mjV52: "MJ V5.2", mjV51: "MJ V5.1", nijiV6: "Niji V6", nijiV5: "Niji V5", nijiV4: "Niji V4", nijiJourney: "Niji Journey", }, botList: { midjourneyBot: "Midjourney 機器人", nijiJourney: "Niji Journey", }, dimensionsList: { square: "正方形 (1:1)", portrait: "肖像 (2:3)", landscape: "風景 (3:2)", }, } ,suno:{ "description": "描述模式", "custom": "專業模式", "style": "歌曲風格", "stylepls": "歌曲名稱,例如:流行音樂", "emputy": "暫無內容", "noly": "無歌詞", "inputly": "請輸入歌曲名稱或歌詞", "doingly": "正在進行中,請稍候。", "doingly2": "正在獲取歌詞...", "title": "歌曲名稱", "titlepls": "歌曲名稱,例如:假期", "desc": "歌曲描述", "descpls": "歌曲描述,例如:關於假期的原聲流行音樂", "noneedly": "無需歌詞", "rank": "隨機獲取", "ly": "歌詞", "lypls": "歌詞:有一定的格式", "generate": "創作歌曲", "generately": "生成歌詞", "nodata": "請先創作才有歌曲列表", "menu": "音樂", "menuinfo": "Suno 音樂創作", "server": "Suno API 端點", "serverabout": "Suno 相關", "setOpenKeyPlaceholder": "Suno API 的相關KEY;可不填", upMps: '上載音頻', extend: '擴展', extendFrom: '擴展自', extendAt: '擴展始於', fail: '失敗', info: '說明:
    上載音頻的持續時間必須在6秒到60秒之間' } ,video:{ "menu": "視頻", "menuinfo": "Luma及其他視頻創作", "descpls": "視頻創作描述", "lumaabout": "關於Luma", "lumaserver": "Luma API端點", "setOpenKeyPlaceholder": "Luma API金鑰,選填", "generate": "生成視頻", "nodata": "暫無可用視頻,請先生成!", "selectimg": "選擇圖片", "clear": "清除", "plsInput": "請輸入內容!", "submitSuccess": "提交成功!", "process": "視頻生成中...", "repeat": "重新獲取", "lumainfo": "說明:
    • 1. Pro 和 relax 演示視頻都有水印的鏈接
    • 2. Pro 無水印版本需要通過「下載按鈕」得到下載鏈接
    • 3. Pro 得到的鏈接有時限;請及時保存 MP4 文件到本地
    • 4. Pro 請在生成後的 30 分鐘內;將 MP4 保存到本地,渠道號也可能被封或者下線
    • 5. Pro 當下載鏈接無效時會給出帶水印的視頻鏈接
    ", "runwayabout": "Runway 相關", "runwayserver": "Runway 接口地址", "setOpenKeyPlaceholder2": "Runway API 的key, 可不填", "endImg": "尾幀圖", "runwayinfo": "說明:
    • 1. Runway 圖片與視頻都有有效期
    • 2. 請在生成視頻後 30 分鐘內將 MP4 保存到本地
    ", "nosup": "暫不支持", "rwgen2": "版本: Gen-2, 價格實惠", "rwgen3": "版本: Gen-3 Alpha", "repeat2":"Expired.Reget", rwgen3turbo:'版本: Gen-3 Alpha Turbo', gen3a_turbo_img:'Gen-3 Alpha Turbo 必须带图', }, dance:{ menu: "跳舞", menuinfo: "使用 Viggle 等創作舞蹈影片。", character: "人物角色", viggleabout: "關於 Viggle", viggleserver: "Viggle API 接口地址", setOpenKeyPlaceholder: "Viggle API 的 key,可選填", info: "說明:
    1. 角色圖片最好是全身照片。
    2. 舞蹈模板影片最好是個人影片,不要是團體舞蹈。", model: "模型", bgw: "白色背景", bgg: "綠色背景", bgmoban: "模板背景", bgrole: "角色背景", gring: "生成中...", uprolefirst: "請先上傳角色圖片", uprolefail: "上傳失敗", upvideo: "+ 上傳模板跳舞影片", usevideo: "+ 使用官方模板", moban: "跳舞模板", moban2: "模板名稱", use: "使用" } } ================================================ FILE: src/main.ts ================================================ import { createApp } from 'vue' import App from './App.vue' import { setupI18n } from './locales' import { setupAssets, setupScrollbarStyle } from './plugins' import { setupStore } from './store' import { setupRouter } from './router' async function bootstrap() { const app = createApp(App) setupAssets() setupScrollbarStyle() setupStore(app) setupI18n(app) await setupRouter(app) app.mount('#app') } bootstrap() ================================================ FILE: src/plugins/assets.ts ================================================ import 'katex/dist/katex.min.css' import '@/styles/lib/tailwind.css' import '@/styles/lib/highlight.less' import '@/styles/lib/github-markdown.less' import '@/styles/global.less' /** Tailwind's Preflight Style Override */ function naiveStyleOverride() { const meta = document.createElement('meta') meta.name = 'naive-ui-style' document.head.appendChild(meta) } function setupAssets() { naiveStyleOverride() } export default setupAssets ================================================ FILE: src/plugins/index.ts ================================================ import setupAssets from './assets' import setupScrollbarStyle from './scrollbarStyle' export { setupAssets, setupScrollbarStyle } ================================================ FILE: src/plugins/scrollbarStyle.ts ================================================ import { darkTheme, lightTheme } from 'naive-ui' const setupScrollbarStyle = () => { const style = document.createElement('style') const styleContent = ` ::-webkit-scrollbar { background-color: transparent; width: ${lightTheme.Scrollbar.common?.scrollbarWidth}; } ::-webkit-scrollbar-thumb { background-color: ${lightTheme.Scrollbar.common?.scrollbarColor}; border-radius: ${lightTheme.Scrollbar.common?.scrollbarBorderRadius}; } html.dark ::-webkit-scrollbar { background-color: transparent; width: ${darkTheme.Scrollbar.common?.scrollbarWidth}; } html.dark ::-webkit-scrollbar-thumb { background-color: ${darkTheme.Scrollbar.common?.scrollbarColor}; border-radius: ${darkTheme.Scrollbar.common?.scrollbarBorderRadius}; } ` style.innerHTML = styleContent document.head.appendChild(style) } export default setupScrollbarStyle ================================================ FILE: src/router/index.ts ================================================ import type { App } from 'vue' import type { RouteRecordRaw } from 'vue-router' import { createRouter, createWebHashHistory } from 'vue-router' import { setupPageGuard } from './permission' import { ChatLayout } from '@/views/chat/layout' import mjlayout from '@/views/mj/layout.vue' import sunoLayout from '@/views/suno/layout.vue' import lumaLayout from '@/views/luma/layout.vue' const routes: RouteRecordRaw[] = [ { path: '/', name: 'Root', component: ChatLayout, redirect: '/chat', children: [ { path: '/chat/:uuid?', name: 'Chat', component: () => import('@/views/chat/index.vue'), }, ], }, { path: '/g', name: 'g', component: ChatLayout, redirect: '/g/g-2fkFE8rbu', children: [ { path: '/g/:gid', name: 'GPTs', component: () => import('@/views/chat/index.vue'), }, ], }, { path: '/m', name: 'm', component: ChatLayout, redirect: '/m/gpt-3.5-turbo', children: [ { path: '/m/:gid', name: 'Model', component: () => import('@/views/chat/index.vue'), }, ], }, { path: '/s', name: 's', component: ChatLayout, redirect: '/s/t', children: [ { path: '/s/t', name: 'Setting', component: () => import('@/views/chat/index.vue'), }, ], }, { path: '/draw', name: 'Rootdraw', component: mjlayout, redirect: '/draw/index', children: [ { path: '/draw/:uuid?', name: 'draw', component: () => import('@/views/mj/draw.vue'), }, ], }, { path: '/music', name: 'music', component: sunoLayout, redirect: '/music/index', children: [ { path: '/music/:uuid?', name: 'music', component: () => import('@/views/suno/music.vue'), }, ], }, { path: '/video', name: 'video', component: lumaLayout, redirect: '/video/index', children: [ { path: '/video/:uuid?', name: 'video', component: () => import('@/views/luma/video.vue'), }, ], }, { path: '/dance', name: 'dance', component: lumaLayout, redirect: '/dance/index', children: [ { path: '/dance/:uuid?', name: 'dance', component: () => import('@/views/viggle/dance.vue'), }, ], }, { path: '/wav', name: 'wav', component: lumaLayout, redirect: '/wav/index', children: [ { path: '/wav/:uuid?', name: 'wav', component: () => import('@/views/wav/wav.vue'), }, ], }, //调试 // { // path: '/mytest', // name: 'mytest', // component: () => import('@/views/mj/myTest.vue'), // }, { path: '/404', name: '404', component: () => import('@/views/exception/404/index.vue'), }, { path: '/500', name: '500', component: () => import('@/views/exception/500/index.vue'), }, { path: '/:pathMatch(.*)*', name: 'notFound', redirect: '/404', }, ] export const router = createRouter({ history: createWebHashHistory(), routes, scrollBehavior: () => ({ left: 0, top: 0 }), }) setupPageGuard(router) export async function setupRouter(app: App) { app.use(router) await router.isReady() } ================================================ FILE: src/router/permission.ts ================================================ import type { Router } from 'vue-router' import { useAuthStoreWithout } from '@/store/modules/auth' export function setupPageGuard(router: Router) { router.beforeEach(async (to, from, next) => { const authStore = useAuthStoreWithout() if (!authStore.session) { try { const data = await authStore.getSession() if (String(data.auth) === 'false' && authStore.token) authStore.removeToken() if (to.path === '/500') next({ name: 'Root' }) else next() } catch (error) { if (to.path !== '/500') next({ name: '500' }) else next() } } else { next() } }) } ================================================ FILE: src/static/mitf/assets/mj.js ================================================ var Sa = function(c, a) { c = c || this; var h = c.window , p = c.document , d = new function() { var e = /^(statics|enumerable|beans|preserve)$/ , t = [] , n = t.slice , i = Object.create , r = Object.getOwnPropertyDescriptor , s = Object.defineProperty , u = t.forEach || function(_, v) { for (var b = 0, T = this.length; b < T; b++) _.call(v, this[b], b, this) } , o = function(_, v) { for (var b in this) this.hasOwnProperty(b) && _.call(v, this[b], b, this) } , l = Object.assign || function(_) { for (var v = 1, b = arguments.length; v < b; v++) { var T = arguments[v]; for (var x in T) T.hasOwnProperty(x) && (_[x] = T[x]) } return _ } , f = function(_, v, b) { if (_) { var T = r(_, "length"); (T && typeof T.value == "number" ? u : o).call(_, v, b = b || _) } return b }; function g(_, v, b, T, x) { var S = {}; function I(N, L) { L = L || (L = r(v, N)) && (L.get ? L : L.value), typeof L == "string" && L[0] === "#" && (L = _[L.substring(1)] || L); var R = typeof L == "function", D = L, V = x || R && !L.base ? L && L.get ? N in _ : _[N] : null, z; (!x || !V) && (R && V && (L.base = V), R && T !== !1 && (z = N.match(/^([gs]et|is)(([A-Z])(.*))$/)) && (S[z[3].toLowerCase() + z[4]] = z[2]), (!D || R || !D.get || typeof D.get != "function" || !y.isPlainObject(D)) && (D = { value: D, writable: !0 }), (r(_, N) || { configurable: !0 }).configurable && (D.configurable = !0, D.enumerable = b ?? !z), s(_, N, D)) } if (v) { for (var m in v) v.hasOwnProperty(m) && !e.test(m) && I(m); for (var m in S) { var w = S[m] , E = _["set" + w] , A = _["get" + w] || E && _["is" + w]; A && (T === !0 || A.length === 0) && I(m, { get: A, set: E }) } } return _ } function y() { for (var _ = 0, v = arguments.length; _ < v; _++) { var b = arguments[_]; b && l(this, b) } return this } return g(y, { inject: function(_) { if (_) { var v = _.statics === !0 ? _ : _.statics , b = _.beans , T = _.preserve; v !== _ && g(this.prototype, _, _.enumerable, b, T), g(this, v, null, b, T) } for (var x = 1, S = arguments.length; x < S; x++) this.inject(arguments[x]); return this }, extend: function() { for (var _ = this, v, b, T = 0, x, S = arguments.length; T < S && !(v && b); T++) x = arguments[T], v = v || x.initialize, b = b || x.prototype; return v = v || function() { _.apply(this, arguments) } , b = v.prototype = b || i(this.prototype), s(b, "constructor", { value: v, writable: !0, configurable: !0 }), g(v, this), arguments.length && this.inject.apply(v, arguments), v.base = _, v } }).inject({ enumerable: !1, initialize: y, set: y, inject: function() { for (var _ = 0, v = arguments.length; _ < v; _++) { var b = arguments[_]; b && g(this, b, b.enumerable, b.beans, b.preserve) } return this }, extend: function() { var _ = i(this); return _.inject.apply(_, arguments) }, each: function(_, v) { return f(this, _, v) }, clone: function() { return new this.constructor(this) }, statics: { set: l, each: f, create: i, define: s, describe: r, clone: function(_) { return l(new _.constructor, _) }, isPlainObject: function(_) { var v = _ != null && _.constructor; return v && (v === Object || v === y || v.name === "Object") }, pick: function(_, v) { return _ !== a ? _ : v }, slice: function(_, v, b) { return n.call(_, v, b) } } }) } ; d.inject({ enumerable: !1, toString: function() { return this._id != null ? (this._class || "Object") + (this._name ? " '" + this._name + "'" : " @" + this._id) : "{ " + d.each(this, function(e, t) { if (!/^_/.test(t)) { var n = typeof e; this.push(t + ": " + (n === "number" ? k.instance.number(e) : n === "string" ? "'" + e + "'" : e)) } }, []).join(", ") + " }" }, getClassName: function() { return this._class || "" }, importJSON: function(e) { return d.importJSON(e, this) }, exportJSON: function(e) { return d.exportJSON(this, e) }, toJSON: function() { return d.serialize(this) }, set: function(e, t) { return e && d.filter(this, e, t, this._prioritize), this } }, { beans: !1, statics: { exports: {}, extend: function e() { var t = e.base.apply(this, arguments) , n = t.prototype._class; return n && !d.exports[n] && (d.exports[n] = t), t }, equals: function(e, t) { if (e === t) return !0; if (e && e.equals) return e.equals(t); if (t && t.equals) return t.equals(e); if (e && t && typeof e == "object" && typeof t == "object") { if (Array.isArray(e) && Array.isArray(t)) { var n = e.length; if (n !== t.length) return !1; for (; n--; ) if (!d.equals(e[n], t[n])) return !1 } else { var i = Object.keys(e) , n = i.length; if (n !== Object.keys(t).length) return !1; for (; n--; ) { var r = i[n]; if (!(t.hasOwnProperty(r) && d.equals(e[r], t[r]))) return !1 } } return !0 } return !1 }, read: function(e, t, n, i) { if (this === d) { var r = this.peek(e, t); return e.__index++, r } var s = this.prototype , u = s._readIndex , o = t || u && e.__index || 0 , l = e.length , f = e[o]; if (i = i || l - o, f instanceof this || n && n.readNull && f == null && i <= 1) return u && (e.__index = o + 1), f && n && n.clone ? f.clone() : f; if (f = d.create(s), u && (f.__read = !0), f = f.initialize.apply(f, o > 0 || o + i < l ? d.slice(e, o, o + i) : e) || f, u) { e.__index = o + f.__read; var g = f.__filtered; g && (e.__filtered = g, f.__filtered = a), f.__read = a } return f }, peek: function(e, t) { return e[e.__index = t || e.__index || 0] }, remain: function(e) { return e.length - (e.__index || 0) }, readList: function(e, t, n, i) { for (var r = [], s, u = t || 0, o = i ? u + i : e.length, l = u; l < o; l++) r.push(Array.isArray(s = e[l]) ? this.read(s, 0, n) : this.read(e, l, n, 1)); return r }, readNamed: function(e, t, n, i, r) { var s = this.getNamed(e, t) , u = s !== a; if (u) { var o = e.__filtered; if (!o) { var l = this.getSource(e); o = e.__filtered = d.create(l), o.__unfiltered = l } o[t] = a } return this.read(u ? [s] : e, n, i, r) }, readSupported: function(e, t) { var n = this.getSource(e) , i = this , r = !1; return n && Object.keys(n).forEach(function(s) { if (s in t) { var u = i.readNamed(e, s); u !== a && (t[s] = u), r = !0 } }), r }, getSource: function(e) { var t = e.__source; if (t === a) { var n = e.length === 1 && e[0]; t = e.__source = n && d.isPlainObject(n) ? n : null } return t }, getNamed: function(e, t) { var n = this.getSource(e); if (n) return t ? n[t] : e.__filtered || n }, hasNamed: function(e, t) { return !!this.getNamed(e, t) }, filter: function(e, t, n, i) { var r; function s(g) { if (!(n && g in n) && !(r && g in r)) { var y = t[g]; y !== a && (e[g] = y) } } if (i) { for (var u = {}, o = 0, l, f = i.length; o < f; o++) (l = i[o])in t && (s(l), u[l] = !0); r = u } return Object.keys(t.__unfiltered || t).forEach(s), e }, isPlainValue: function(e, t) { return d.isPlainObject(e) || Array.isArray(e) || t && typeof e == "string" }, serialize: function(e, t, n, i) { t = t || {}; var r = !i, s; if (r && (t.formatter = new k(t.precision), i = { length: 0, definitions: {}, references: {}, add: function(y, _) { var v = "#" + y._id , b = this.references[v]; if (!b) { this.length++; var T = _.call(y) , x = y._class; x && T[0] !== x && T.unshift(x), this.definitions[v] = T, b = this.references[v] = [v] } return b } }), e && e._serialize) { s = e._serialize(t, i); var u = e._class; u && !e._compactSerialize && (r || !n) && s[0] !== u && s.unshift(u) } else if (Array.isArray(e)) { s = []; for (var o = 0, l = e.length; o < l; o++) s[o] = d.serialize(e[o], t, n, i) } else if (d.isPlainObject(e)) { s = {}; for (var f = Object.keys(e), o = 0, l = f.length; o < l; o++) { var g = f[o]; s[g] = d.serialize(e[g], t, n, i) } } else typeof e == "number" ? s = t.formatter.number(e, t.precision) : s = e; return r && i.length > 0 ? [["dictionary", i.definitions], s] : s }, deserialize: function(e, t, n, i, r) { var s = e , u = !n , o = u && e && e.length && e[0][0] === "dictionary"; if (n = n || {}, Array.isArray(e)) { var l = e[0] , f = l === "dictionary"; if (e.length == 1 && /^#/.test(l)) return n.dictionary[l]; l = d.exports[l], s = []; for (var g = l ? 1 : 0, y = e.length; g < y; g++) s.push(d.deserialize(e[g], t, n, f, o)); if (l) { var _ = s; t ? s = t(l, _, u || r) : s = new l(_) } } else if (d.isPlainObject(e)) { s = {}, i && (n.dictionary = s); for (var v in e) s[v] = d.deserialize(e[v], t, n) } return o ? s[1] : s }, exportJSON: function(e, t) { var n = d.serialize(e, t); return t && t.asString == !1 ? n : JSON.stringify(n) }, importJSON: function(e, t) { return d.deserialize(typeof e == "string" ? JSON.parse(e) : e, function(n, i, r) { var s = r && t && t.constructor === n , u = s ? t : d.create(n.prototype); if (i.length === 1 && u instanceof oe && (s || !(u instanceof ct))) { var o = i[0]; d.isPlainObject(o) && (o.insert = !1, s && (i = i.concat([oe.INSERT]))) } return (s ? u.set : n).apply(u, i), s && (t = null), u }) }, push: function(e, t) { var n = t.length; if (n < 4096) e.push.apply(e, t); else { var i = e.length; e.length += n; for (var r = 0; r < n; r++) e[i + r] = t[r] } return e }, splice: function(e, t, n, i) { var r = t && t.length , s = n === a; n = s ? e.length : n, n > e.length && (n = e.length); for (var u = 0; u < r; u++) t[u]._index = n + u; if (s) return d.push(e, t), []; var o = [n, i]; t && d.push(o, t); for (var l = e.splice.apply(e, o), u = 0, f = l.length; u < f; u++) l[u]._index = a; for (var u = n + r, f = e.length; u < f; u++) e[u]._index = u; return l }, capitalize: function(e) { return e.replace(/\b[a-z]/g, function(t) { return t.toUpperCase() }) }, camelize: function(e) { return e.replace(/-(.)/g, function(t, n) { return n.toUpperCase() }) }, hyphenate: function(e) { return e.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase() } } }); var M = { on: function(e, t) { if (typeof e != "string") d.each(e, function(s, u) { this.on(u, s) }, this); else { var n = this._eventTypes , i = n && n[e] , r = this._callbacks = this._callbacks || {}; r = r[e] = r[e] || [], r.indexOf(t) === -1 && (r.push(t), i && i.install && r.length === 1 && i.install.call(this, e)) } return this }, off: function(e, t) { if (typeof e != "string") { d.each(e, function(u, o) { this.off(o, u) }, this); return } var n = this._eventTypes, i = n && n[e], r = this._callbacks && this._callbacks[e], s; return r && (!t || (s = r.indexOf(t)) !== -1 && r.length === 1 ? (i && i.uninstall && i.uninstall.call(this, e), delete this._callbacks[e]) : s !== -1 && r.splice(s, 1)), this }, once: function(e, t) { return this.on(e, function n() { t.apply(this, arguments), this.off(e, n) }) }, emit: function(e, t) { var n = this._callbacks && this._callbacks[e]; if (!n) return !1; var i = d.slice(arguments, 1) , r = t && t.target && !t.currentTarget; n = n.slice(), r && (t.currentTarget = this); for (var s = 0, u = n.length; s < u; s++) if (n[s].apply(this, i) == !1) { t && t.stop && t.stop(); break } return r && delete t.currentTarget, !0 }, responds: function(e) { return !!(this._callbacks && this._callbacks[e]) }, attach: "#on", detach: "#off", fire: "#emit", _installEvents: function(e) { var t = this._eventTypes , n = this._callbacks , i = e ? "install" : "uninstall"; if (t) { for (var r in n) if (n[r].length > 0) { var s = t[r] , u = s && s[i]; u && u.call(this, r) } } }, statics: { inject: function e(t) { var n = t._events; if (n) { var i = {}; d.each(n, function(r, s) { var u = typeof r == "string" , o = u ? r : s , l = d.capitalize(o) , f = o.substring(2).toLowerCase(); i[f] = u ? {} : r, o = "_" + o, t["get" + l] = function() { return this[o] } , t["set" + l] = function(g) { var y = this[o]; y && this.off(f, y), g && this.on(f, g), this[o] = g } }), t._eventTypes = i } return e.base.apply(this, arguments) } } } , F = d.extend({ _class: "PaperScope", initialize: function e() { ae = this, this.settings = new d({ applyMatrix: !0, insertItems: !0, handleSize: 4, hitTolerance: 0 }), this.project = null, this.projects = [], this.tools = [], this._id = e._id++, e._scopes[this._id] = this; var t = e.prototype; if (!this.support) { var n = Je.getContext(1, 1) || {}; t.support = { nativeDash: "setLineDash"in n || "mozDash"in n, nativeBlendModes: nn.nativeModes }, Je.release(n) } if (!this.agent) { var i = c.navigator.userAgent.toLowerCase() , r = (/(darwin|win|mac|linux|freebsd|sunos)/.exec(i) || [])[0] , s = r === "darwin" ? "mac" : r , u = t.agent = t.browser = { platform: s }; s && (u[s] = !0), i.replace(/(opera|chrome|safari|webkit|firefox|msie|trident|atom|node|jsdom)\/?\s*([.\d]+)(?:.*version\/([.\d]+))?(?:.*rv\:v?([.\d]+))?/g, function(o, l, f, g, y) { if (!u.chrome) { var _ = l === "opera" ? g : /^(node|trident)$/.test(l) ? y : f; u.version = _, u.versionNumber = parseFloat(_), l = { trident: "msie", jsdom: "node" }[l] || l, u.name = l, u[l] = !0 } }), u.chrome && delete u.webkit, u.atom && delete u.chrome } }, version: "0.12.17", getView: function() { var e = this.project; return e && e._view }, getPaper: function() { return this }, execute: function(e, t) {}, install: function(e) { var t = this; d.each(["project", "view", "tool"], function(i) { d.define(e, i, { configurable: !0, get: function() { return t[i] } }) }); for (var n in this) !/^_/.test(n) && this[n] && (e[n] = this[n]) }, setup: function(e) { return h.paper = this, this.project = new ye(e), this }, createCanvas: function(e, t) { return Je.getCanvas(e, t) }, activate: function() { ae = this }, clear: function() { for (var e = this.projects, t = this.tools, n = e.length - 1; n >= 0; n--) e[n].remove(); for (var n = t.length - 1; n >= 0; n--) t[n].remove() }, remove: function() { this.clear(), delete F._scopes[this._id] }, statics: new function() { function e(t) { return t += "Attribute", function(n, i) { return n[t](i) || n[t]("data-paper-" + i) } } return { _scopes: {}, _id: 0, get: function(t) { return this._scopes[t] || null }, getAttribute: e("get"), hasAttribute: e("has") } } }) , Z = d.extend(M, { initialize: function(e) { this._scope = ae, this._index = this._scope[this._list].push(this) - 1, (e || !this._scope[this._reference]) && this.activate() }, activate: function() { if (!this._scope) return !1; var e = this._scope[this._reference]; return e && e !== this && e.emit("deactivate"), this._scope[this._reference] = this, this.emit("activate", e), !0 }, isActive: function() { return this._scope[this._reference] === this }, remove: function() { return this._index == null ? !1 : (d.splice(this._scope[this._list], null, this._index, 1), this._scope[this._reference] == this && (this._scope[this._reference] = null), this._scope = null, !0) }, getView: function() { return this._scope.getView() } }) , q = { findItemBoundsCollisions: function(e, t, n) { function i(u) { for (var o = new Array(u.length), l = 0; l < u.length; l++) { var f = u[l].getBounds(); o[l] = [f.left, f.top, f.right, f.bottom] } return o } var r = i(e) , s = !t || t === e ? r : i(t); return this.findBoundsCollisions(r, s, n || 0) }, findCurveBoundsCollisions: function(e, t, n, i) { function r(_) { for (var v = Math.min, b = Math.max, T = new Array(_.length), x = 0; x < _.length; x++) { var S = _[x]; T[x] = [v(S[0], S[2], S[4], S[6]), v(S[1], S[3], S[5], S[7]), b(S[0], S[2], S[4], S[6]), b(S[1], S[3], S[5], S[7])] } return T } var s = r(e) , u = !t || t === e ? s : r(t); if (i) { for (var o = this.findBoundsCollisions(s, u, n || 0, !1, !0), l = this.findBoundsCollisions(s, u, n || 0, !0, !0), f = [], g = 0, y = o.length; g < y; g++) f[g] = { hor: o[g], ver: l[g] }; return f } return this.findBoundsCollisions(s, u, n || 0) }, findBoundsCollisions: function(e, t, n, i, r) { var s = !t || e === t , u = s ? e : e.concat(t) , o = e.length , l = u.length; function f(se, ue, Ie) { for (var Ee = 0, de = se.length; Ee < de; ) { var ve = de + Ee >>> 1; u[se[ve]][ue] < Ie ? Ee = ve + 1 : de = ve } return Ee - 1 } for (var g = i ? 1 : 0, y = g + 2, _ = i ? 0 : 1, v = _ + 2, b = new Array(l), T = 0; T < l; T++) b[T] = T; b.sort(function(se, ue) { return u[se][g] - u[ue][g] }); for (var x = [], S = new Array(o), T = 0; T < l; T++) { var I = b[T] , m = u[I] , w = s ? I : I - o , E = I < o , A = s || !E , N = E ? [] : null; if (x.length) { var L = f(x, y, m[g] - n) + 1; if (x.splice(0, L), s && r) { N = N.concat(x); for (var R = 0; R < x.length; R++) { var D = x[R]; S[D].push(w) } } else for (var V = m[v], z = m[_], R = 0; R < x.length; R++) { var D = x[R] , G = u[D] , H = D < o , K = s || D >= o; (r || (E && K || A && H) && V >= G[_] - n && z <= G[v] + n) && (E && K && N.push(s ? D : D - o), A && H && S[D].push(w)) } } if (E && (e === t && N.push(I), S[I] = N), x.length) { var $ = m[y] , W = f(x, y, $); x.splice(W + 1, 0, I) } else x.push(I) } for (var T = 0; T < S.length; T++) { var te = S[T]; te && te.sort(function(ue, Ie) { return ue - Ie }) } return S } } , k = d.extend({ initialize: function(e) { this.precision = d.pick(e, 5), this.multiplier = Math.pow(10, this.precision) }, number: function(e) { return this.precision < 16 ? Math.round(e * this.multiplier) / this.multiplier : e }, pair: function(e, t, n) { return this.number(e) + (n || ",") + this.number(t) }, point: function(e, t) { return this.number(e.x) + (t || ",") + this.number(e.y) }, size: function(e, t) { return this.number(e.width) + (t || ",") + this.number(e.height) }, rectangle: function(e, t) { return this.point(e, t) + (t || ",") + this.size(e, t) } }); k.instance = new k; var O = new function() { var e = [[.5773502691896257], [0, .7745966692414834], [.33998104358485626, .8611363115940526], [0, .5384693101056831, .906179845938664], [.2386191860831969, .6612093864662645, .932469514203152], [0, .4058451513773972, .7415311855993945, .9491079123427585], [.1834346424956498, .525532409916329, .7966664774136267, .9602898564975363], [0, .3242534234038089, .6133714327005904, .8360311073266358, .9681602395076261], [.14887433898163122, .4333953941292472, .6794095682990244, .8650633666889845, .9739065285171717], [0, .26954315595234496, .5190961292068118, .7301520055740494, .8870625997680953, .978228658146057], [.1252334085114689, .3678314989981802, .5873179542866175, .7699026741943047, .9041172563704749, .9815606342467192], [0, .2304583159551348, .44849275103644687, .6423493394403402, .8015780907333099, .9175983992229779, .9841830547185881], [.10805494870734367, .31911236892788974, .5152486363581541, .6872929048116855, .827201315069765, .9284348836635735, .9862838086968123], [0, .20119409399743451, .3941513470775634, .5709721726085388, .7244177313601701, .8482065834104272, .937273392400706, .9879925180204854], [.09501250983763744, .2816035507792589, .45801677765722737, .6178762444026438, .755404408355003, .8656312023878318, .9445750230732326, .9894009349916499]] , t = [[1], [.8888888888888888, .5555555555555556], [.6521451548625461, .34785484513745385], [.5688888888888889, .47862867049936647, .23692688505618908], [.46791393457269104, .3607615730481386, .17132449237917036], [.4179591836734694, .3818300505051189, .27970539148927664, .1294849661688697], [.362683783378362, .31370664587788727, .22238103445337448, .10122853629037626], [.3302393550012598, .31234707704000286, .26061069640293544, .1806481606948574, .08127438836157441], [.29552422471475287, .26926671930999635, .21908636251598204, .1494513491505806, .06667134430868814], [.2729250867779006, .26280454451024665, .23319376459199048, .18629021092773426, .1255803694649046, .05566856711617366], [.24914704581340277, .2334925365383548, .20316742672306592, .16007832854334622, .10693932599531843, .04717533638651183], [.2325515532308739, .22628318026289723, .2078160475368885, .17814598076194574, .13887351021978725, .09212149983772845, .04048400476531588], [.2152638534631578, .2051984637212956, .18553839747793782, .15720316715819355, .12151857068790319, .08015808715976021, .03511946033175186], [.2025782419255613, .19843148532711158, .1861610000155622, .16626920581699392, .13957067792615432, .10715922046717194, .07036604748810812, .03075324199611727], [.1894506104550685, .18260341504492358, .16915651939500254, .14959598881657674, .12462897125553388, .09515851168249279, .062253523938647894, .027152459411754096]] , n = Math.abs , i = Math.sqrt , r = Math.pow , s = Math.log2 || function(y) { return Math.log(y) * Math.LOG2E } , u = 1e-12 , o = 112e-18; function l(y, _, v) { return y < _ ? _ : y > v ? v : y } function f(y, _, v) { function b(L) { var R = L * 134217729 , D = L - R , V = D + R , z = L - V; return [V, z] } var T = _ * _ - y * v , x = _ * _ + y * v; if (n(T) * 3 < x) { var S = b(y) , I = b(_) , m = b(v) , w = _ * _ , E = I[0] * I[0] - w + 2 * I[0] * I[1] + I[1] * I[1] , A = y * v , N = S[0] * m[0] - A + S[0] * m[1] + S[1] * m[0] + S[1] * m[1]; T = w - A + (E - N) } return T } function g() { var y = Math.max.apply(Math, arguments); return y && (y < 1e-8 || y > 1e8) ? r(2, -Math.round(s(y))) : 0 } return { EPSILON: u, MACHINE_EPSILON: o, CURVETIME_EPSILON: 1e-8, GEOMETRIC_EPSILON: 1e-7, TRIGONOMETRIC_EPSILON: 1e-8, ANGULAR_EPSILON: 1e-5, KAPPA: 4 * (i(2) - 1) / 3, isZero: function(y) { return y >= -u && y <= u }, isMachineZero: function(y) { return y >= -o && y <= o }, clamp: l, integrate: function(y, _, v, b) { for (var T = e[b - 2], x = t[b - 2], S = (v - _) * .5, I = S + _, m = 0, w = b + 1 >> 1, E = b & 1 ? x[m++] * y(I) : 0; m < w; ) { var A = S * T[m]; E += x[m++] * (y(I + A) + y(I - A)) } return S * E }, findRoot: function(y, _, v, b, T, x, S) { for (var I = 0; I < x; I++) { var m = y(v) , w = m / _(v) , E = v - w; if (n(w) < S) { v = E; break } m > 0 ? (T = v, v = E <= b ? (b + T) * .5 : E) : (b = v, v = E >= T ? (b + T) * .5 : E) } return l(v, b, T) }, solveQuadratic: function(y, _, v, b, T, x) { var S, I = 1 / 0; if (n(y) < u) { if (n(_) < u) return n(v) < u ? -1 : 0; S = -v / _ } else { _ *= -.5; var m = f(y, _, v); if (m && n(m) < o) { var w = g(n(y), n(_), n(v)); w && (y *= w, _ *= w, v *= w, m = f(y, _, v)) } if (m >= -o) { var E = m < 0 ? 0 : i(m) , A = _ + (_ < 0 ? -E : E); A === 0 ? (S = v / y, I = -S) : (S = A / y, I = v / A) } } var N = 0 , L = T == null , R = T - u , D = x + u; return isFinite(S) && (L || S > R && S < D) && (b[N++] = L ? S : l(S, T, x)), I !== S && isFinite(I) && (L || I > R && I < D) && (b[N++] = L ? I : l(I, T, x)), N }, solveCubic: function(y, _, v, b, T, x, S) { var I = g(n(y), n(_), n(v), n(b)), m, w, E, A, N; I && (y *= I, _ *= I, v *= I, b *= I); function L(W) { m = W; var te = y * m; w = te + _, E = w * m + v, A = (te + w) * m + E, N = E * m + b } if (n(y) < u) y = _, w = v, E = b, m = 1 / 0; else if (n(b) < u) w = _, E = v, m = 0; else { L(-(_ / y) / 3); var R = N / y , D = r(n(R), 1 / 3) , V = R < 0 ? -1 : 1 , z = -A / y , G = z > 0 ? 1.324717957244746 * Math.max(D, i(z)) : D , H = m - V * G; if (H !== m) { do L(H), H = A === 0 ? m : m - N / A / (1 + o); while (V * H > V * m); n(y) * m * m > n(b / m) && (E = -b / m, w = (E - v) / m) } } var K = O.solveQuadratic(y, w, E, T, x, S) , $ = x == null; return isFinite(m) && (K === 0 || K > 0 && m !== T[0] && m !== T[1]) && ($ || m > x - u && m < S + u) && (T[K++] = $ ? m : l(m, x, S)), K } } } , B = { _id: 1, _pools: {}, get: function(e) { if (e) { var t = this._pools[e]; return t || (t = this._pools[e] = { _id: 1 }), t._id++ } else return this._id++ } } , C = d.extend({ _class: "Point", _readIndex: !0, initialize: function(t, n) { var i = typeof t , r = this.__read , s = 0; if (i === "number") { var u = typeof n == "number"; this._set(t, u ? n : t), r && (s = u ? 2 : 1) } else if (i === "undefined" || t === null) this._set(0, 0), r && (s = t === null ? 1 : 0); else { var o = i === "string" ? t.split(/[\s,]+/) || [] : t; s = 1, Array.isArray(o) ? this._set(+o[0], +(o.length > 1 ? o[1] : o[0])) : "x"in o ? this._set(o.x || 0, o.y || 0) : "width"in o ? this._set(o.width || 0, o.height || 0) : "angle"in o ? (this._set(o.length || 0, 0), this.setAngle(o.angle || 0)) : (this._set(0, 0), s = 0) } return r && (this.__read = s), this }, set: "#initialize", _set: function(e, t) { return this.x = e, this.y = t, this }, equals: function(e) { return this === e || e && (this.x === e.x && this.y === e.y || Array.isArray(e) && this.x === e[0] && this.y === e[1]) || !1 }, clone: function() { return new C(this.x,this.y) }, toString: function() { var e = k.instance; return "{ x: " + e.number(this.x) + ", y: " + e.number(this.y) + " }" }, _serialize: function(e) { var t = e.formatter; return [t.number(this.x), t.number(this.y)] }, getLength: function() { return Math.sqrt(this.x * this.x + this.y * this.y) }, setLength: function(e) { if (this.isZero()) { var t = this._angle || 0; this._set(Math.cos(t) * e, Math.sin(t) * e) } else { var n = e / this.getLength(); O.isZero(n) && this.getAngle(), this._set(this.x * n, this.y * n) } }, getAngle: function() { return this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI }, setAngle: function(e) { this.setAngleInRadians.call(this, e * Math.PI / 180) }, getAngleInDegrees: "#getAngle", setAngleInDegrees: "#setAngle", getAngleInRadians: function() { if (arguments.length) { var e = C.read(arguments) , t = this.getLength() * e.getLength(); if (O.isZero(t)) return NaN; var n = this.dot(e) / t; return Math.acos(n < -1 ? -1 : n > 1 ? 1 : n) } else return this.isZero() ? this._angle || 0 : this._angle = Math.atan2(this.y, this.x) }, setAngleInRadians: function(e) { if (this._angle = e, !this.isZero()) { var t = this.getLength(); this._set(Math.cos(e) * t, Math.sin(e) * t) } }, getQuadrant: function() { return this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3 } }, { beans: !1, getDirectedAngle: function() { var e = C.read(arguments); return Math.atan2(this.cross(e), this.dot(e)) * 180 / Math.PI }, getDistance: function() { var e = arguments , t = C.read(e) , n = t.x - this.x , i = t.y - this.y , r = n * n + i * i , s = d.read(e); return s ? r : Math.sqrt(r) }, normalize: function(e) { e === a && (e = 1); var t = this.getLength() , n = t !== 0 ? e / t : 0 , i = new C(this.x * n,this.y * n); return n >= 0 && (i._angle = this._angle), i }, rotate: function(e, t) { if (e === 0) return this.clone(); e = e * Math.PI / 180; var n = t ? this.subtract(t) : this , i = Math.sin(e) , r = Math.cos(e); return n = new C(n.x * r - n.y * i,n.x * i + n.y * r), t ? n.add(t) : n }, transform: function(e) { return e ? e._transformPoint(this) : this }, add: function() { var e = C.read(arguments); return new C(this.x + e.x,this.y + e.y) }, subtract: function() { var e = C.read(arguments); return new C(this.x - e.x,this.y - e.y) }, multiply: function() { var e = C.read(arguments); return new C(this.x * e.x,this.y * e.y) }, divide: function() { var e = C.read(arguments); return new C(this.x / e.x,this.y / e.y) }, modulo: function() { var e = C.read(arguments); return new C(this.x % e.x,this.y % e.y) }, negate: function() { return new C(-this.x,-this.y) }, isInside: function() { return Y.read(arguments).contains(this) }, isClose: function() { var e = arguments , t = C.read(e) , n = d.read(e); return this.getDistance(t) <= n }, isCollinear: function() { var e = C.read(arguments); return C.isCollinear(this.x, this.y, e.x, e.y) }, isColinear: "#isCollinear", isOrthogonal: function() { var e = C.read(arguments); return C.isOrthogonal(this.x, this.y, e.x, e.y) }, isZero: function() { var e = O.isZero; return e(this.x) && e(this.y) }, isNaN: function() { return isNaN(this.x) || isNaN(this.y) }, isInQuadrant: function(e) { return this.x * (e > 1 && e < 4 ? -1 : 1) >= 0 && this.y * (e > 2 ? -1 : 1) >= 0 }, dot: function() { var e = C.read(arguments); return this.x * e.x + this.y * e.y }, cross: function() { var e = C.read(arguments); return this.x * e.y - this.y * e.x }, project: function() { var e = C.read(arguments) , t = e.isZero() ? 0 : this.dot(e) / e.dot(e); return new C(e.x * t,e.y * t) }, statics: { min: function() { var e = arguments , t = C.read(e) , n = C.read(e); return new C(Math.min(t.x, n.x),Math.min(t.y, n.y)) }, max: function() { var e = arguments , t = C.read(e) , n = C.read(e); return new C(Math.max(t.x, n.x),Math.max(t.y, n.y)) }, random: function() { return new C(Math.random(),Math.random()) }, isCollinear: function(e, t, n, i) { return Math.abs(e * i - t * n) <= Math.sqrt((e * e + t * t) * (n * n + i * i)) * 1e-8 }, isOrthogonal: function(e, t, n, i) { return Math.abs(e * n + t * i) <= Math.sqrt((e * e + t * t) * (n * n + i * i)) * 1e-8 } } }, d.each(["round", "ceil", "floor", "abs"], function(e) { var t = Math[e]; this[e] = function() { return new C(t(this.x),t(this.y)) } }, {})) , Q = C.extend({ initialize: function(t, n, i, r) { this._x = t, this._y = n, this._owner = i, this._setter = r }, _set: function(e, t, n) { return this._x = e, this._y = t, n || this._owner[this._setter](this), this }, getX: function() { return this._x }, setX: function(e) { this._x = e, this._owner[this._setter](this) }, getY: function() { return this._y }, setY: function(e) { this._y = e, this._owner[this._setter](this) }, isSelected: function() { return !!(this._owner._selection & this._getSelection()) }, setSelected: function(e) { this._owner._changeSelection(this._getSelection(), e) }, _getSelection: function() { return this._setter === "setPosition" ? 4 : 0 } }) , J = d.extend({ _class: "Size", _readIndex: !0, initialize: function(t, n) { var i = typeof t , r = this.__read , s = 0; if (i === "number") { var u = typeof n == "number"; this._set(t, u ? n : t), r && (s = u ? 2 : 1) } else if (i === "undefined" || t === null) this._set(0, 0), r && (s = t === null ? 1 : 0); else { var o = i === "string" ? t.split(/[\s,]+/) || [] : t; s = 1, Array.isArray(o) ? this._set(+o[0], +(o.length > 1 ? o[1] : o[0])) : "width"in o ? this._set(o.width || 0, o.height || 0) : "x"in o ? this._set(o.x || 0, o.y || 0) : (this._set(0, 0), s = 0) } return r && (this.__read = s), this }, set: "#initialize", _set: function(e, t) { return this.width = e, this.height = t, this }, equals: function(e) { return e === this || e && (this.width === e.width && this.height === e.height || Array.isArray(e) && this.width === e[0] && this.height === e[1]) || !1 }, clone: function() { return new J(this.width,this.height) }, toString: function() { var e = k.instance; return "{ width: " + e.number(this.width) + ", height: " + e.number(this.height) + " }" }, _serialize: function(e) { var t = e.formatter; return [t.number(this.width), t.number(this.height)] }, add: function() { var e = J.read(arguments); return new J(this.width + e.width,this.height + e.height) }, subtract: function() { var e = J.read(arguments); return new J(this.width - e.width,this.height - e.height) }, multiply: function() { var e = J.read(arguments); return new J(this.width * e.width,this.height * e.height) }, divide: function() { var e = J.read(arguments); return new J(this.width / e.width,this.height / e.height) }, modulo: function() { var e = J.read(arguments); return new J(this.width % e.width,this.height % e.height) }, negate: function() { return new J(-this.width,-this.height) }, isZero: function() { var e = O.isZero; return e(this.width) && e(this.height) }, isNaN: function() { return isNaN(this.width) || isNaN(this.height) }, statics: { min: function(e, t) { return new J(Math.min(e.width, t.width),Math.min(e.height, t.height)) }, max: function(e, t) { return new J(Math.max(e.width, t.width),Math.max(e.height, t.height)) }, random: function() { return new J(Math.random(),Math.random()) } } }, d.each(["round", "ceil", "floor", "abs"], function(e) { var t = Math[e]; this[e] = function() { return new J(t(this.width),t(this.height)) } }, {})) , ne = J.extend({ initialize: function(t, n, i, r) { this._width = t, this._height = n, this._owner = i, this._setter = r }, _set: function(e, t, n) { return this._width = e, this._height = t, n || this._owner[this._setter](this), this }, getWidth: function() { return this._width }, setWidth: function(e) { this._width = e, this._owner[this._setter](this) }, getHeight: function() { return this._height }, setHeight: function(e) { this._height = e, this._owner[this._setter](this) } }) , Y = d.extend({ _class: "Rectangle", _readIndex: !0, beans: !0, initialize: function(t, n, i, r) { var s = arguments, u = typeof t, o; if (u === "number" ? (this._set(t, n, i, r), o = 4) : u === "undefined" || t === null ? (this._set(0, 0, 0, 0), o = t === null ? 1 : 0) : s.length === 1 && (Array.isArray(t) ? (this._set.apply(this, t), o = 1) : t.x !== a || t.width !== a ? (this._set(t.x || 0, t.y || 0, t.width || 0, t.height || 0), o = 1) : t.from === a && t.to === a && (this._set(0, 0, 0, 0), d.readSupported(s, this) && (o = 1))), o === a) { var l = C.readNamed(s, "from"), f = d.peek(s), g = l.x, y = l.y, _, v; if (f && f.x !== a || d.hasNamed(s, "to")) { var b = C.readNamed(s, "to"); _ = b.x - g, v = b.y - y, _ < 0 && (g = b.x, _ = -_), v < 0 && (y = b.y, v = -v) } else { var T = J.read(s); _ = T.width, v = T.height } this._set(g, y, _, v), o = s.__index } var x = s.__filtered; return x && (this.__filtered = x), this.__read && (this.__read = o), this }, set: "#initialize", _set: function(e, t, n, i) { return this.x = e, this.y = t, this.width = n, this.height = i, this }, clone: function() { return new Y(this.x,this.y,this.width,this.height) }, equals: function(e) { var t = d.isPlainValue(e) ? Y.read(arguments) : e; return t === this || t && this.x === t.x && this.y === t.y && this.width === t.width && this.height === t.height || !1 }, toString: function() { var e = k.instance; return "{ x: " + e.number(this.x) + ", y: " + e.number(this.y) + ", width: " + e.number(this.width) + ", height: " + e.number(this.height) + " }" }, _serialize: function(e) { var t = e.formatter; return [t.number(this.x), t.number(this.y), t.number(this.width), t.number(this.height)] }, getPoint: function(e) { var t = e ? C : Q; return new t(this.x,this.y,this,"setPoint") }, setPoint: function() { var e = C.read(arguments); this.x = e.x, this.y = e.y }, getSize: function(e) { var t = e ? J : ne; return new t(this.width,this.height,this,"setSize") }, _fw: 1, _fh: 1, setSize: function() { var e = J.read(arguments) , t = this._sx , n = this._sy , i = e.width , r = e.height; t && (this.x += (this.width - i) * t), n && (this.y += (this.height - r) * n), this.width = i, this.height = r, this._fw = this._fh = 1 }, getLeft: function() { return this.x }, setLeft: function(e) { if (!this._fw) { var t = e - this.x; this.width -= this._sx === .5 ? t * 2 : t } this.x = e, this._sx = this._fw = 0 }, getTop: function() { return this.y }, setTop: function(e) { if (!this._fh) { var t = e - this.y; this.height -= this._sy === .5 ? t * 2 : t } this.y = e, this._sy = this._fh = 0 }, getRight: function() { return this.x + this.width }, setRight: function(e) { if (!this._fw) { var t = e - this.x; this.width = this._sx === .5 ? t * 2 : t } this.x = e - this.width, this._sx = 1, this._fw = 0 }, getBottom: function() { return this.y + this.height }, setBottom: function(e) { if (!this._fh) { var t = e - this.y; this.height = this._sy === .5 ? t * 2 : t } this.y = e - this.height, this._sy = 1, this._fh = 0 }, getCenterX: function() { return this.x + this.width / 2 }, setCenterX: function(e) { this._fw || this._sx === .5 ? this.x = e - this.width / 2 : (this._sx && (this.x += (e - this.x) * 2 * this._sx), this.width = (e - this.x) * 2), this._sx = .5, this._fw = 0 }, getCenterY: function() { return this.y + this.height / 2 }, setCenterY: function(e) { this._fh || this._sy === .5 ? this.y = e - this.height / 2 : (this._sy && (this.y += (e - this.y) * 2 * this._sy), this.height = (e - this.y) * 2), this._sy = .5, this._fh = 0 }, getCenter: function(e) { var t = e ? C : Q; return new t(this.getCenterX(),this.getCenterY(),this,"setCenter") }, setCenter: function() { var e = C.read(arguments); return this.setCenterX(e.x), this.setCenterY(e.y), this }, getArea: function() { return this.width * this.height }, isEmpty: function() { return this.width === 0 || this.height === 0 }, contains: function(e) { return e && e.width !== a || (Array.isArray(e) ? e : arguments).length === 4 ? this._containsRectangle(Y.read(arguments)) : this._containsPoint(C.read(arguments)) }, _containsPoint: function(e) { var t = e.x , n = e.y; return t >= this.x && n >= this.y && t <= this.x + this.width && n <= this.y + this.height }, _containsRectangle: function(e) { var t = e.x , n = e.y; return t >= this.x && n >= this.y && t + e.width <= this.x + this.width && n + e.height <= this.y + this.height }, intersects: function() { var e = Y.read(arguments) , t = d.read(arguments) || 0; return e.x + e.width > this.x - t && e.y + e.height > this.y - t && e.x < this.x + this.width + t && e.y < this.y + this.height + t }, intersect: function() { var e = Y.read(arguments) , t = Math.max(this.x, e.x) , n = Math.max(this.y, e.y) , i = Math.min(this.x + this.width, e.x + e.width) , r = Math.min(this.y + this.height, e.y + e.height); return new Y(t,n,i - t,r - n) }, unite: function() { var e = Y.read(arguments) , t = Math.min(this.x, e.x) , n = Math.min(this.y, e.y) , i = Math.max(this.x + this.width, e.x + e.width) , r = Math.max(this.y + this.height, e.y + e.height); return new Y(t,n,i - t,r - n) }, include: function() { var e = C.read(arguments) , t = Math.min(this.x, e.x) , n = Math.min(this.y, e.y) , i = Math.max(this.x + this.width, e.x) , r = Math.max(this.y + this.height, e.y); return new Y(t,n,i - t,r - n) }, expand: function() { var e = J.read(arguments) , t = e.width , n = e.height; return new Y(this.x - t / 2,this.y - n / 2,this.width + t,this.height + n) }, scale: function(e, t) { return this.expand(this.width * e - this.width, this.height * (t === a ? e : t) - this.height) } }, d.each([["Top", "Left"], ["Top", "Right"], ["Bottom", "Left"], ["Bottom", "Right"], ["Left", "Center"], ["Top", "Center"], ["Right", "Center"], ["Bottom", "Center"]], function(e, t) { var n = e.join("") , i = /^[RL]/.test(n); t >= 4 && (e[1] += i ? "Y" : "X"); var r = e[i ? 0 : 1] , s = e[i ? 1 : 0] , u = "get" + r , o = "get" + s , l = "set" + r , f = "set" + s , g = "get" + n , y = "set" + n; this[g] = function(_) { var v = _ ? C : Q; return new v(this[u](),this[o](),this,y) } , this[y] = function() { var _ = C.read(arguments); this[l](_.x), this[f](_.y) } }, { beans: !0 })) , Me = Y.extend({ initialize: function(t, n, i, r, s, u) { this._set(t, n, i, r, !0), this._owner = s, this._setter = u }, _set: function(e, t, n, i, r) { return this._x = e, this._y = t, this._width = n, this._height = i, r || this._owner[this._setter](this), this } }, new function() { var e = Y.prototype; return d.each(["x", "y", "width", "height"], function(t) { var n = d.capitalize(t) , i = "_" + t; this["get" + n] = function() { return this[i] } , this["set" + n] = function(r) { this[i] = r, this._dontNotify || this._owner[this._setter](this) } }, d.each(["Point", "Size", "Center", "Left", "Top", "Right", "Bottom", "CenterX", "CenterY", "TopLeft", "TopRight", "BottomLeft", "BottomRight", "LeftCenter", "TopCenter", "RightCenter", "BottomCenter"], function(t) { var n = "set" + t; this[n] = function() { this._dontNotify = !0, e[n].apply(this, arguments), this._dontNotify = !1, this._owner[this._setter](this) } }, { isSelected: function() { return !!(this._owner._selection & 2) }, setSelected: function(t) { var n = this._owner; n._changeSelection && n._changeSelection(2, t) } })) } ) , le = d.extend({ _class: "Matrix", initialize: function e(t, n) { var i = arguments , r = i.length , s = !0; if (r >= 6 ? this._set.apply(this, i) : r === 1 || r === 2 ? t instanceof e ? this._set(t._a, t._b, t._c, t._d, t._tx, t._ty, n) : Array.isArray(t) ? this._set.apply(this, n ? t.concat([n]) : t) : s = !1 : r ? s = !1 : this.reset(), !s) throw new Error("Unsupported matrix parameters"); return this }, set: "#initialize", _set: function(e, t, n, i, r, s, u) { return this._a = e, this._b = t, this._c = n, this._d = i, this._tx = r, this._ty = s, u || this._changed(), this }, _serialize: function(e, t) { return d.serialize(this.getValues(), e, !0, t) }, _changed: function() { var e = this._owner; e && (e._applyMatrix ? e.transform(null, !0) : e._changed(25)) }, clone: function() { return new le(this._a,this._b,this._c,this._d,this._tx,this._ty) }, equals: function(e) { return e === this || e && this._a === e._a && this._b === e._b && this._c === e._c && this._d === e._d && this._tx === e._tx && this._ty === e._ty }, toString: function() { var e = k.instance; return "[[" + [e.number(this._a), e.number(this._c), e.number(this._tx)].join(", ") + "], [" + [e.number(this._b), e.number(this._d), e.number(this._ty)].join(", ") + "]]" }, reset: function(e) { return this._a = this._d = 1, this._b = this._c = this._tx = this._ty = 0, e || this._changed(), this }, apply: function(e, t) { var n = this._owner; return n ? (n.transform(null, d.pick(e, !0), t), this.isIdentity()) : !1 }, translate: function() { var e = C.read(arguments) , t = e.x , n = e.y; return this._tx += t * this._a + n * this._c, this._ty += t * this._b + n * this._d, this._changed(), this }, scale: function() { var e = arguments , t = C.read(e) , n = C.read(e, 0, { readNull: !0 }); return n && this.translate(n), this._a *= t.x, this._b *= t.x, this._c *= t.y, this._d *= t.y, n && this.translate(n.negate()), this._changed(), this }, rotate: function(e) { e *= Math.PI / 180; var t = C.read(arguments, 1) , n = t.x , i = t.y , r = Math.cos(e) , s = Math.sin(e) , u = n - n * r + i * s , o = i - n * s - i * r , l = this._a , f = this._b , g = this._c , y = this._d; return this._a = r * l + s * g, this._b = r * f + s * y, this._c = -s * l + r * g, this._d = -s * f + r * y, this._tx += u * l + o * g, this._ty += u * f + o * y, this._changed(), this }, shear: function() { var e = arguments , t = C.read(e) , n = C.read(e, 0, { readNull: !0 }); n && this.translate(n); var i = this._a , r = this._b; return this._a += t.y * this._c, this._b += t.y * this._d, this._c += t.x * i, this._d += t.x * r, n && this.translate(n.negate()), this._changed(), this }, skew: function() { var e = arguments , t = C.read(e) , n = C.read(e, 0, { readNull: !0 }) , i = Math.PI / 180 , r = new C(Math.tan(t.x * i),Math.tan(t.y * i)); return this.shear(r, n) }, append: function(e, t) { if (e) { var n = this._a , i = this._b , r = this._c , s = this._d , u = e._a , o = e._c , l = e._b , f = e._d , g = e._tx , y = e._ty; this._a = u * n + l * r, this._c = o * n + f * r, this._b = u * i + l * s, this._d = o * i + f * s, this._tx += g * n + y * r, this._ty += g * i + y * s, t || this._changed() } return this }, prepend: function(e, t) { if (e) { var n = this._a , i = this._b , r = this._c , s = this._d , u = this._tx , o = this._ty , l = e._a , f = e._c , g = e._b , y = e._d , _ = e._tx , v = e._ty; this._a = l * n + f * i, this._c = l * r + f * s, this._b = g * n + y * i, this._d = g * r + y * s, this._tx = l * u + f * o + _, this._ty = g * u + y * o + v, t || this._changed() } return this }, appended: function(e) { return this.clone().append(e) }, prepended: function(e) { return this.clone().prepend(e) }, invert: function() { var e = this._a , t = this._b , n = this._c , i = this._d , r = this._tx , s = this._ty , u = e * i - t * n , o = null; return u && !isNaN(u) && isFinite(r) && isFinite(s) && (this._a = i / u, this._b = -t / u, this._c = -n / u, this._d = e / u, this._tx = (n * s - i * r) / u, this._ty = (t * r - e * s) / u, o = this), o }, inverted: function() { return this.clone().invert() }, concatenate: "#append", preConcatenate: "#prepend", chain: "#appended", _shiftless: function() { return new le(this._a,this._b,this._c,this._d,0,0) }, _orNullIfIdentity: function() { return this.isIdentity() ? null : this }, isIdentity: function() { return this._a === 1 && this._b === 0 && this._c === 0 && this._d === 1 && this._tx === 0 && this._ty === 0 }, isInvertible: function() { var e = this._a * this._d - this._c * this._b; return e && !isNaN(e) && isFinite(this._tx) && isFinite(this._ty) }, isSingular: function() { return !this.isInvertible() }, transform: function(e, t, n) { return arguments.length < 3 ? this._transformPoint(C.read(arguments)) : this._transformCoordinates(e, t, n) }, _transformPoint: function(e, t, n) { var i = e.x , r = e.y; return t || (t = new C), t._set(i * this._a + r * this._c + this._tx, i * this._b + r * this._d + this._ty, n) }, _transformCoordinates: function(e, t, n) { for (var i = 0, r = 2 * n; i < r; i += 2) { var s = e[i] , u = e[i + 1]; t[i] = s * this._a + u * this._c + this._tx, t[i + 1] = s * this._b + u * this._d + this._ty } return t }, _transformCorners: function(e) { var t = e.x , n = e.y , i = t + e.width , r = n + e.height , s = [t, n, i, n, i, r, t, r]; return this._transformCoordinates(s, s, 4) }, _transformBounds: function(e, t, n) { for (var i = this._transformCorners(e), r = i.slice(0, 2), s = r.slice(), u = 2; u < 8; u++) { var o = i[u] , l = u & 1; o < r[l] ? r[l] = o : o > s[l] && (s[l] = o) } return t || (t = new Y), t._set(r[0], r[1], s[0] - r[0], s[1] - r[1], n) }, inverseTransform: function() { return this._inverseTransform(C.read(arguments)) }, _inverseTransform: function(e, t, n) { var i = this._a , r = this._b , s = this._c , u = this._d , o = this._tx , l = this._ty , f = i * u - r * s , g = null; if (f && !isNaN(f) && isFinite(o) && isFinite(l)) { var y = e.x - this._tx , _ = e.y - this._ty; t || (t = new C), g = t._set((y * u - _ * s) / f, (_ * i - y * r) / f, n) } return g }, decompose: function() { var e = this._a, t = this._b, n = this._c, i = this._d, r = e * i - t * n, s = Math.sqrt, u = Math.atan2, o = 180 / Math.PI, l, f, g; if (e !== 0 || t !== 0) { var y = s(e * e + t * t); l = Math.acos(e / y) * (t > 0 ? 1 : -1), f = [y, r / y], g = [u(e * n + t * i, y * y), 0] } else if (n !== 0 || i !== 0) { var _ = s(n * n + i * i); l = Math.asin(n / _) * (i > 0 ? 1 : -1), f = [r / _, _], g = [0, u(e * n + t * i, _ * _)] } else l = 0, g = f = [0, 0]; return { translation: this.getTranslation(), rotation: l * o, scaling: new C(f), skewing: new C(g[0] * o,g[1] * o) } }, getValues: function() { return [this._a, this._b, this._c, this._d, this._tx, this._ty] }, getTranslation: function() { return new C(this._tx,this._ty) }, getScaling: function() { return this.decompose().scaling }, getRotation: function() { return this.decompose().rotation }, applyToContext: function(e) { this.isIdentity() || e.transform(this._a, this._b, this._c, this._d, this._tx, this._ty) } }, d.each(["a", "b", "c", "d", "tx", "ty"], function(e) { var t = d.capitalize(e) , n = "_" + e; this["get" + t] = function() { return this[n] } , this["set" + t] = function(i) { this[n] = i, this._changed() } }, {})) , Se = d.extend({ _class: "Line", initialize: function(t, n, i, r, s) { var u = !1; arguments.length >= 4 ? (this._px = t, this._py = n, this._vx = i, this._vy = r, u = s) : (this._px = t.x, this._py = t.y, this._vx = n.x, this._vy = n.y, u = i), u || (this._vx -= this._px, this._vy -= this._py) }, getPoint: function() { return new C(this._px,this._py) }, getVector: function() { return new C(this._vx,this._vy) }, getLength: function() { return this.getVector().getLength() }, intersect: function(e, t) { return Se.intersect(this._px, this._py, this._vx, this._vy, e._px, e._py, e._vx, e._vy, !0, t) }, getSide: function(e, t) { return Se.getSide(this._px, this._py, this._vx, this._vy, e.x, e.y, !0, t) }, getDistance: function(e) { return Math.abs(this.getSignedDistance(e)) }, getSignedDistance: function(e) { return Se.getSignedDistance(this._px, this._py, this._vx, this._vy, e.x, e.y, !0) }, isCollinear: function(e) { return C.isCollinear(this._vx, this._vy, e._vx, e._vy) }, isOrthogonal: function(e) { return C.isOrthogonal(this._vx, this._vy, e._vx, e._vy) }, statics: { intersect: function(e, t, n, i, r, s, u, o, l, f) { l || (n -= e, i -= t, u -= r, o -= s); var g = n * o - i * u; if (!O.isMachineZero(g)) { var y = e - r , _ = t - s , v = (u * _ - o * y) / g , b = (n * _ - i * y) / g , T = 1e-12 , x = -T , S = 1 + T; if (f || x < v && v < S && x < b && b < S) return f || (v = v <= 0 ? 0 : v >= 1 ? 1 : v), new C(e + v * n,t + v * i) } }, getSide: function(e, t, n, i, r, s, u, o) { u || (n -= e, i -= t); var l = r - e , f = s - t , g = l * i - f * n; return !o && O.isMachineZero(g) && (g = (l * n + l * n) / (n * n + i * i), g >= 0 && g <= 1 && (g = 0)), g < 0 ? -1 : g > 0 ? 1 : 0 }, getSignedDistance: function(e, t, n, i, r, s, u) { return u || (n -= e, i -= t), n === 0 ? i > 0 ? r - e : e - r : i === 0 ? n < 0 ? s - t : t - s : ((r - e) * i - (s - t) * n) / (i > n ? i * Math.sqrt(1 + n * n / (i * i)) : n * Math.sqrt(1 + i * i / (n * n))) }, getDistance: function(e, t, n, i, r, s, u) { return Math.abs(Se.getSignedDistance(e, t, n, i, r, s, u)) } } }) , ye = Z.extend({ _class: "Project", _list: "projects", _reference: "project", _compactSerialize: !0, initialize: function(t) { Z.call(this, !0), this._children = [], this._namedChildren = {}, this._activeLayer = null, this._currentStyle = new Kt(null,null,this), this._view = Ke.create(this, t || Je.getCanvas(1, 1)), this._selectionItems = {}, this._selectionCount = 0, this._updateVersion = 0 }, _serialize: function(e, t) { return d.serialize(this._children, e, !0, t) }, _changed: function(e, t) { if (e & 1) { var n = this._view; n && (n._needsUpdate = !0, !n._requested && n._autoUpdate && n.requestUpdate()) } var i = this._changes; if (i && t) { var r = this._changesById , s = t._id , u = r[s]; u ? u.flags |= e : i.push(r[s] = { item: t, flags: e }) } }, clear: function() { for (var e = this._children, t = e.length - 1; t >= 0; t--) e[t].remove() }, isEmpty: function() { return !this._children.length }, remove: function e() { return e.base.call(this) ? (this._view && this._view.remove(), !0) : !1 }, getView: function() { return this._view }, getCurrentStyle: function() { return this._currentStyle }, setCurrentStyle: function(e) { this._currentStyle.set(e) }, getIndex: function() { return this._index }, getOptions: function() { return this._scope.settings }, getLayers: function() { return this._children }, getActiveLayer: function() { return this._activeLayer || new ct({ project: this, insert: !0 }) }, getSymbolDefinitions: function() { var e = [] , t = {}; return this.getItems({ class: ft, match: function(n) { var i = n._definition , r = i._id; return t[r] || (t[r] = !0, e.push(i)), !1 } }), e }, getSymbols: "getSymbolDefinitions", getSelectedItems: function() { var e = this._selectionItems , t = []; for (var n in e) { var i = e[n] , r = i._selection; r & 1 && i.isInserted() ? t.push(i) : r || this._updateSelection(i) } return t }, _updateSelection: function(e) { var t = e._id , n = this._selectionItems; e._selection ? n[t] !== e && (this._selectionCount++, n[t] = e) : n[t] === e && (this._selectionCount--, delete n[t]) }, selectAll: function() { for (var e = this._children, t = 0, n = e.length; t < n; t++) e[t].setFullySelected(!0) }, deselectAll: function() { var e = this._selectionItems; for (var t in e) e[t].setFullySelected(!1) }, addLayer: function(e) { return this.insertLayer(a, e) }, insertLayer: function(e, t) { if (t instanceof ct) { t._remove(!1, !0), d.splice(this._children, [t], e, 0), t._setProject(this, !0); var n = t._name; n && t.setName(n), this._changes && t._changed(5), this._activeLayer || (this._activeLayer = t) } else t = null; return t }, _insertItem: function(e, t, n) { return t = this.insertLayer(e, t) || (this._activeLayer || this._insertItem(a, new ct(oe.NO_INSERT), !0)).insertChild(e, t), n && t.activate && t.activate(), t }, getItems: function(e) { return oe._getItems(this, e) }, getItem: function(e) { return oe._getItems(this, e, null, null, !0)[0] || null }, importJSON: function(e) { this.activate(); var t = this._activeLayer; return d.importJSON(e, t && t.isEmpty() && t) }, removeOn: function(e) { var t = this._removeSets; if (t) { e === "mouseup" && (t.mousedrag = null); var n = t[e]; if (n) { for (var i in n) { var r = n[i]; for (var s in t) { var u = t[s]; u && u != n && delete u[r._id] } r.remove() } t[e] = null } } }, draw: function(e, t, n) { this._updateVersion++, e.save(), t.applyToContext(e); for (var i = this._children, r = new d({ offset: new C(0,0), pixelRatio: n, viewMatrix: t.isIdentity() ? null : t, matrices: [new le], updateMatrix: !0 }), s = 0, u = i.length; s < u; s++) i[s].draw(e, r); if (e.restore(), this._selectionCount > 0) { e.save(), e.strokeWidth = 1; var o = this._selectionItems , l = this._scope.settings.handleSize , f = this._updateVersion; for (var g in o) o[g]._drawSelection(e, t, l, o, f); e.restore() } } }) , oe = d.extend(M, { statics: { extend: function e(t) { return t._serializeFields && (t._serializeFields = d.set({}, this.prototype._serializeFields, t._serializeFields)), e.base.apply(this, arguments) }, INSERT: { insert: !0 }, NO_INSERT: { insert: !1 } }, _class: "Item", _name: null, _applyMatrix: !0, _canApplyMatrix: !0, _canScaleStroke: !1, _pivot: null, _visible: !0, _blendMode: "normal", _opacity: 1, _locked: !1, _guide: !1, _clipMask: !1, _selection: 0, _selectBounds: !0, _selectChildren: !1, _serializeFields: { name: null, applyMatrix: null, matrix: new le, pivot: null, visible: !0, blendMode: "normal", opacity: 1, locked: !1, guide: !1, clipMask: !1, selected: !1, data: {} }, _prioritize: ["applyMatrix"] }, new function() { var e = ["onMouseDown", "onMouseUp", "onMouseDrag", "onClick", "onDoubleClick", "onMouseMove", "onMouseEnter", "onMouseLeave"]; return d.each(e, function(t) { this._events[t] = { install: function(n) { this.getView()._countItemEvent(n, 1) }, uninstall: function(n) { this.getView()._countItemEvent(n, -1) } } }, { _events: { onFrame: { install: function() { this.getView()._animateItem(this, !0) }, uninstall: function() { this.getView()._animateItem(this, !1) } }, onLoad: {}, onError: {} }, statics: { _itemHandlers: e } }) } , { initialize: function() {}, _initialize: function(e, t) { var n = e && d.isPlainObject(e) , i = n && e.internal === !0 , r = this._matrix = new le , s = n && e.project || ae.project , u = ae.settings; return this._id = i ? null : B.get(), this._parent = this._index = null, this._applyMatrix = this._canApplyMatrix && u.applyMatrix, t && r.translate(t), r._owner = this, this._style = new Kt(s._currentStyle,this,s), i || n && e.insert == !1 || !u.insertItems && !(n && e.insert == !0) ? this._setProject(s) : (n && e.parent || s)._insertItem(a, this, !0), n && e !== oe.NO_INSERT && e !== oe.INSERT && this.set(e, { internal: !0, insert: !0, project: !0, parent: !0 }), n }, _serialize: function(e, t) { var n = {} , i = this; function r(s) { for (var u in s) { var o = i[u]; d.equals(o, u === "leading" ? s.fontSize * 1.2 : s[u]) || (n[u] = d.serialize(o, e, u !== "data", t)) } } return r(this._serializeFields), this instanceof We || r(this._style._defaults), [this._class, n] }, _changed: function(e) { var t = this._symbol , n = this._parent || t , i = this._project; e & 8 && (this._bounds = this._position = this._decomposed = a), e & 16 && (this._globalMatrix = a), n && e & 72 && oe._clearBoundsCache(n), e & 2 && oe._clearBoundsCache(this), i && i._changed(e, this), t && t._changed(e) }, getId: function() { return this._id }, getName: function() { return this._name }, setName: function(e) { if (this._name && this._removeNamed(), e === +e + "") throw new Error("Names consisting only of numbers are not supported."); var t = this._getOwner(); if (e && t) { var n = t._children , i = t._namedChildren; (i[e] = i[e] || []).push(this), e in n || (n[e] = this) } this._name = e || a, this._changed(256) }, getStyle: function() { return this._style }, setStyle: function(e) { this.getStyle().set(e) } }, d.each(["locked", "visible", "blendMode", "opacity", "guide"], function(e) { var t = d.capitalize(e) , n = "_" + e , i = { locked: 256, visible: 265 }; this["get" + t] = function() { return this[n] } , this["set" + t] = function(r) { r != this[n] && (this[n] = r, this._changed(i[e] || 257)) } }, {}), { beans: !0, getSelection: function() { return this._selection }, setSelection: function(e) { if (e !== this._selection) { this._selection = e; var t = this._project; t && (t._updateSelection(this), this._changed(257)) } }, _changeSelection: function(e, t) { var n = this._selection; this.setSelection(t ? n | e : n & ~e) }, isSelected: function() { if (this._selectChildren) { for (var e = this._children, t = 0, n = e.length; t < n; t++) if (e[t].isSelected()) return !0 } return !!(this._selection & 1) }, setSelected: function(e) { if (this._selectChildren) for (var t = this._children, n = 0, i = t.length; n < i; n++) t[n].setSelected(e); this._changeSelection(1, e) }, isFullySelected: function() { var e = this._children , t = !!(this._selection & 1); if (e && t) { for (var n = 0, i = e.length; n < i; n++) if (!e[n].isFullySelected()) return !1; return !0 } return t }, setFullySelected: function(e) { var t = this._children; if (t) for (var n = 0, i = t.length; n < i; n++) t[n].setFullySelected(e); this._changeSelection(1, e) }, isClipMask: function() { return this._clipMask }, setClipMask: function(e) { this._clipMask != (e = !!e) && (this._clipMask = e, e && (this.setFillColor(null), this.setStrokeColor(null)), this._changed(257), this._parent && this._parent._changed(2048)) }, getData: function() { return this._data || (this._data = {}), this._data }, setData: function(e) { this._data = e }, getPosition: function(e) { var t = e ? C : Q , n = this._position || (this._position = this._getPositionFromBounds()); return new t(n.x,n.y,this,"setPosition") }, setPosition: function() { this.translate(C.read(arguments).subtract(this.getPosition(!0))) }, _getPositionFromBounds: function(e) { return this._pivot ? this._matrix._transformPoint(this._pivot) : (e || this.getBounds()).getCenter(!0) }, getPivot: function() { var e = this._pivot; return e ? new Q(e.x,e.y,this,"setPivot") : null }, setPivot: function() { this._pivot = C.read(arguments, 0, { clone: !0, readNull: !0 }), this._position = a } }, d.each({ getStrokeBounds: { stroke: !0 }, getHandleBounds: { handle: !0 }, getInternalBounds: { internal: !0 } }, function(e, t) { this[t] = function(n) { return this.getBounds(n, e) } }, { beans: !0, getBounds: function(e, t) { var n = t || e instanceof le , i = d.set({}, n ? t : e, this._boundsOptions); (!i.stroke || this.getStrokeScaling()) && (i.cacheItem = this); var r = this._getCachedBounds(n && e, i).rect; return arguments.length ? r : new Me(r.x,r.y,r.width,r.height,this,"setBounds") }, setBounds: function() { var e = Y.read(arguments) , t = this.getBounds() , n = this._matrix , i = new le , r = e.getCenter(); i.translate(r), (e.width != t.width || e.height != t.height) && (n.isInvertible() || (n.set(n._backup || new le().translate(n.getTranslation())), t = this.getBounds()), i.scale(t.width !== 0 ? e.width / t.width : 0, t.height !== 0 ? e.height / t.height : 0)), r = t.getCenter(), i.translate(-r.x, -r.y), this.transform(i) }, _getBounds: function(e, t) { var n = this._children; return !n || !n.length ? new Y : (oe._updateBoundsCache(this, t.cacheItem), oe._getBounds(n, e, t)) }, _getBoundsCacheKey: function(e, t) { return [e.stroke ? 1 : 0, e.handle ? 1 : 0, t ? 1 : 0].join("") }, _getCachedBounds: function(e, t, n) { e = e && e._orNullIfIdentity(); var i = t.internal && !n , r = t.cacheItem , s = i ? null : this._matrix._orNullIfIdentity() , u = r && (!e || e.equals(s)) && this._getBoundsCacheKey(t, i) , o = this._bounds; if (oe._updateBoundsCache(this._parent || this._symbol, r), u && o && u in o) { var l = o[u]; return { rect: l.rect.clone(), nonscaling: l.nonscaling } } var f = this._getBounds(e || s, t) , g = f.rect || f , y = this._style , _ = f.nonscaling || y.hasStroke() && !y.getStrokeScaling(); if (u) { o || (this._bounds = o = {}); var l = o[u] = { rect: g.clone(), nonscaling: _, internal: i } } return { rect: g, nonscaling: _ } }, _getStrokeMatrix: function(e, t) { var n = this.getStrokeScaling() ? null : t && t.internal ? this : this._parent || this._symbol && this._symbol._item , i = n ? n.getViewMatrix().invert() : e; return i && i._shiftless() }, statics: { _updateBoundsCache: function(e, t) { if (e && t) { var n = t._id , i = e._boundsCache = e._boundsCache || { ids: {}, list: [] }; i.ids[n] || (i.list.push(t), i.ids[n] = t) } }, _clearBoundsCache: function(e) { var t = e._boundsCache; if (t) { e._bounds = e._position = e._boundsCache = a; for (var n = 0, i = t.list, r = i.length; n < r; n++) { var s = i[n]; s !== e && (s._bounds = s._position = a, s._boundsCache && oe._clearBoundsCache(s)) } } }, _getBounds: function(e, t, n) { var i = 1 / 0 , r = -i , s = i , u = r , o = !1; n = n || {}; for (var l = 0, f = e.length; l < f; l++) { var g = e[l]; if (g._visible && !g.isEmpty(!0)) { var y = g._getCachedBounds(t && t.appended(g._matrix), n, !0) , _ = y.rect; i = Math.min(_.x, i), s = Math.min(_.y, s), r = Math.max(_.x + _.width, r), u = Math.max(_.y + _.height, u), y.nonscaling && (o = !0) } } return { rect: isFinite(i) ? new Y(i,s,r - i,u - s) : new Y, nonscaling: o } } } }), { beans: !0, _decompose: function() { return this._applyMatrix ? null : this._decomposed || (this._decomposed = this._matrix.decompose()) }, getRotation: function() { var e = this._decompose(); return e ? e.rotation : 0 }, setRotation: function(e) { var t = this.getRotation(); if (t != null && e != null) { var n = this._decomposed; this.rotate(e - t), n && (n.rotation = e, this._decomposed = n) } }, getScaling: function() { var e = this._decompose() , t = e && e.scaling; return new Q(t ? t.x : 1,t ? t.y : 1,this,"setScaling") }, setScaling: function() { var e = this.getScaling() , t = C.read(arguments, 0, { clone: !0, readNull: !0 }); if (e && t && !e.equals(t)) { var n = this.getRotation() , i = this._decomposed , r = new le , s = O.isZero; if (s(e.x) || s(e.y)) r.translate(i.translation), n && r.rotate(n), r.scale(t.x, t.y), this._matrix.set(r); else { var u = this.getPosition(!0); r.translate(u), n && r.rotate(n), r.scale(t.x / e.x, t.y / e.y), n && r.rotate(-n), r.translate(u.negate()), this.transform(r) } i && (i.scaling = t, this._decomposed = i) } }, getMatrix: function() { return this._matrix }, setMatrix: function() { var e = this._matrix; e.set.apply(e, arguments) }, getGlobalMatrix: function(e) { var t = this._globalMatrix; if (t) for (var n = this._parent, i = []; n; ) { if (!n._globalMatrix) { t = null; for (var r = 0, s = i.length; r < s; r++) i[r]._globalMatrix = null; break } i.push(n), n = n._parent } if (!t) { t = this._globalMatrix = this._matrix.clone(); var n = this._parent; n && t.prepend(n.getGlobalMatrix(!0)) } return e ? t : t.clone() }, getViewMatrix: function() { return this.getGlobalMatrix().prepend(this.getView()._matrix) }, getApplyMatrix: function() { return this._applyMatrix }, setApplyMatrix: function(e) { (this._applyMatrix = this._canApplyMatrix && !!e) && this.transform(null, !0) }, getTransformContent: "#getApplyMatrix", setTransformContent: "#setApplyMatrix" }, { getProject: function() { return this._project }, _setProject: function(e, t) { if (this._project !== e) { this._project && this._installEvents(!1), this._project = e; for (var n = this._children, i = 0, r = n && n.length; i < r; i++) n[i]._setProject(e); t = !0 } t && this._installEvents(!0) }, getView: function() { return this._project._view }, _installEvents: function e(t) { e.base.call(this, t); for (var n = this._children, i = 0, r = n && n.length; i < r; i++) n[i]._installEvents(t) }, getLayer: function() { for (var e = this; e = e._parent; ) if (e instanceof ct) return e; return null }, getParent: function() { return this._parent }, setParent: function(e) { return e.addChild(this) }, _getOwner: "#getParent", getChildren: function() { return this._children }, setChildren: function(e) { this.removeChildren(), this.addChildren(e) }, getFirstChild: function() { return this._children && this._children[0] || null }, getLastChild: function() { return this._children && this._children[this._children.length - 1] || null }, getNextSibling: function() { var e = this._getOwner(); return e && e._children[this._index + 1] || null }, getPreviousSibling: function() { var e = this._getOwner(); return e && e._children[this._index - 1] || null }, getIndex: function() { return this._index }, equals: function(e) { return e === this || e && this._class === e._class && this._style.equals(e._style) && this._matrix.equals(e._matrix) && this._locked === e._locked && this._visible === e._visible && this._blendMode === e._blendMode && this._opacity === e._opacity && this._clipMask === e._clipMask && this._guide === e._guide && this._equals(e) || !1 }, _equals: function(e) { return d.equals(this._children, e._children) }, clone: function(e) { var t = new this.constructor(oe.NO_INSERT) , n = this._children , i = d.pick(e ? e.insert : a, e === a || e === !0) , r = d.pick(e ? e.deep : a, !0); n && t.copyAttributes(this), (!n || r) && t.copyContent(this), n || t.copyAttributes(this), i && t.insertAbove(this); var s = this._name , u = this._parent; if (s && u) { for (var n = u._children, o = s, l = 1; n[s]; ) s = o + " " + l++; s !== o && t.setName(s) } return t }, copyContent: function(e) { for (var t = e._children, n = 0, i = t && t.length; n < i; n++) this.addChild(t[n].clone(!1), !0) }, copyAttributes: function(e, t) { this.setStyle(e._style); for (var n = ["_locked", "_visible", "_blendMode", "_opacity", "_clipMask", "_guide"], i = 0, r = n.length; i < r; i++) { var s = n[i]; e.hasOwnProperty(s) && (this[s] = e[s]) } t || this._matrix.set(e._matrix, !0), this.setApplyMatrix(e._applyMatrix), this.setPivot(e._pivot), this.setSelection(e._selection); var u = e._data , o = e._name; this._data = u ? d.clone(u) : null, o && this.setName(o) }, rasterize: function(e, t) { var n, i, r; d.isPlainObject(e) ? (n = e.resolution, i = e.insert, r = e.raster) : (n = e, i = t), r || (r = new Pt(oe.NO_INSERT)); var s = this.getStrokeBounds() , u = (n || this.getView().getResolution()) / 72 , o = s.getTopLeft().floor() , l = s.getBottomRight().ceil() , f = new J(l.subtract(o)) , g = f.multiply(u); if (r.setSize(g, !0), !g.isZero()) { var y = r.getContext(!0) , _ = new le().scale(u).translate(o.negate()); y.save(), _.applyToContext(y), this.draw(y, new d({ matrices: [_] })), y.restore() } return r._matrix.set(new le().translate(o.add(f.divide(2))).scale(1 / u)), (i === a || i) && r.insertAbove(this), r }, contains: function() { var e = this._matrix; return e.isInvertible() && !!this._contains(e._inverseTransform(C.read(arguments))) }, _contains: function(e) { var t = this._children; if (t) { for (var n = t.length - 1; n >= 0; n--) if (t[n].contains(e)) return !0; return !1 } return e.isInside(this.getInternalBounds()) }, isInside: function() { return Y.read(arguments).contains(this.getBounds()) }, _asPathItem: function() { return new ke.Rectangle({ rectangle: this.getInternalBounds(), matrix: this._matrix, insert: !1 }) }, intersects: function(e, t) { return e instanceof oe ? this._asPathItem().getIntersections(e._asPathItem(), null, t, !0).length > 0 : !1 } }, new function() { function e() { var i = arguments; return this._hitTest(C.read(i), qe.getOptions(i)) } function t() { var i = arguments , r = C.read(i) , s = qe.getOptions(i) , u = []; return this._hitTest(r, new d({ all: u },s)), u } function n(i, r, s, u) { var o = this._children; if (o) for (var l = o.length - 1; l >= 0; l--) { var f = o[l] , g = f !== u && f._hitTest(i, r, s); if (g && !r.all) return g } return null } return ye.inject({ hitTest: e, hitTestAll: t, _hitTest: n }), { hitTest: e, hitTestAll: t, _hitTestChildren: n } } , { _hitTest: function(e, t, n) { if (this._locked || !this._visible || this._guide && !t.guides || this.isEmpty()) return null; var i = this._matrix , r = n ? n.appended(i) : this.getGlobalMatrix().prepend(this.getView()._matrix) , s = Math.max(t.tolerance, 1e-12) , u = t._tolerancePadding = new J(ke._getStrokePadding(s, i._shiftless().invert())); if (e = i._inverseTransform(e), !e || !this._children && !this.getBounds({ internal: !0, stroke: !0, handle: !0 }).expand(u.multiply(2))._containsPoint(e)) return null; var o = !(t.guides && !this._guide || t.selected && !this.isSelected() || t.type && t.type !== d.hyphenate(this._class) || t.class && !(this instanceof t.class)), l = t.match, f = this, g, y; function _(m) { return m && l && !l(m) && (m = null), m && t.all && t.all.push(m), m } function v(m, w) { var E = w ? g["get" + w]() : f.getPosition(); if (e.subtract(E).divide(u).length <= 1) return new qe(m,f,{ name: w ? d.hyphenate(w) : m, point: E }) } var b = t.position , T = t.center , x = t.bounds; if (o && this._parent && (b || T || x)) { if ((T || x) && (g = this.getInternalBounds()), y = b && v("position") || T && v("center", "Center"), !y && x) for (var S = ["TopLeft", "TopRight", "BottomLeft", "BottomRight", "LeftCenter", "TopCenter", "RightCenter", "BottomCenter"], I = 0; I < 8 && !y; I++) y = v("bounds", S[I]); y = _(y) } return y || (y = this._hitTestChildren(e, t, r) || o && _(this._hitTestSelf(e, t, r, this.getStrokeScaling() ? null : r._shiftless().invert())) || null), y && y.point && (y.point = i.transform(y.point)), y }, _hitTestSelf: function(e, t) { if (t.fill && this.hasFill() && this._contains(e)) return new qe("fill",this) }, matches: function(e, t) { function n(u, o) { for (var l in u) if (u.hasOwnProperty(l)) { var f = u[l] , g = o[l]; if (d.isPlainObject(f) && d.isPlainObject(g)) { if (!n(f, g)) return !1 } else if (!d.equals(f, g)) return !1 } return !0 } var i = typeof e; if (i === "object") { for (var r in e) if (e.hasOwnProperty(r) && !this.matches(r, e[r])) return !1; return !0 } else { if (i === "function") return e(this); if (e === "match") return t(this); var s = /^(empty|editable)$/.test(e) ? this["is" + d.capitalize(e)]() : e === "type" ? d.hyphenate(this._class) : this[e]; if (e === "class") { if (typeof t == "function") return this instanceof t; s = this._class } if (typeof t == "function") return !!t(s); if (t) { if (t.test) return t.test(s); if (d.isPlainObject(t)) return n(t, s) } return d.equals(s, t) } }, getItems: function(e) { return oe._getItems(this, e, this._matrix) }, getItem: function(e) { return oe._getItems(this, e, this._matrix, null, !0)[0] || null }, statics: { _getItems: function e(t, n, i, r, s) { if (!r) { var u = typeof n == "object" && n , o = u && u.overlapping , l = u && u.inside , f = o || l , _ = f && Y.read([f]); r = { items: [], recursive: u && u.recursive !== !1, inside: !!l, overlapping: !!o, rect: _, path: o && new ke.Rectangle({ rectangle: _, insert: !1 }) }, u && (n = d.filter({}, n, { recursive: !0, inside: !0, overlapping: !0 })) } var g = t._children , y = r.items , _ = r.rect; i = _ && (i || new le); for (var v = 0, b = g && g.length; v < b; v++) { var T = g[v] , x = i && i.appended(T._matrix) , S = !0; if (_) { var f = T.getBounds(x); if (!_.intersects(f)) continue; _.contains(f) || r.overlapping && (f.contains(_) || r.path.intersects(T, x)) || (S = !1) } if (S && T.matches(n) && (y.push(T), s) || (r.recursive !== !1 && e(T, n, x, r, s), s && y.length > 0)) break } return y } } }, { importJSON: function(e) { var t = d.importJSON(e, this); return t !== this ? this.addChild(t) : t }, addChild: function(e) { return this.insertChild(a, e) }, insertChild: function(e, t) { var n = t ? this.insertChildren(e, [t]) : null; return n && n[0] }, addChildren: function(e) { return this.insertChildren(this._children.length, e) }, insertChildren: function(e, t) { var n = this._children; if (n && t && t.length > 0) { t = d.slice(t); for (var i = {}, r = t.length - 1; r >= 0; r--) { var s = t[r] , u = s && s._id; !s || i[u] ? t.splice(r, 1) : (s._remove(!1, !0), i[u] = !0) } d.splice(n, t, e, 0); for (var o = this._project, l = o._changes, r = 0, f = t.length; r < f; r++) { var s = t[r] , g = s._name; s._parent = this, s._setProject(o, !0), g && s.setName(g), l && s._changed(5) } this._changed(11) } else t = null; return t }, _insertItem: "#insertChild", _insertAt: function(e, t) { var n = e && e._getOwner() , i = e !== this && n ? this : null; return i && (i._remove(!1, !0), n._insertItem(e._index + t, i)), i }, insertAbove: function(e) { return this._insertAt(e, 1) }, insertBelow: function(e) { return this._insertAt(e, 0) }, sendToBack: function() { var e = this._getOwner(); return e ? e._insertItem(0, this) : null }, bringToFront: function() { var e = this._getOwner(); return e ? e._insertItem(a, this) : null }, appendTop: "#addChild", appendBottom: function(e) { return this.insertChild(0, e) }, moveAbove: "#insertAbove", moveBelow: "#insertBelow", addTo: function(e) { return e._insertItem(a, this) }, copyTo: function(e) { return this.clone(!1).addTo(e) }, reduce: function(e) { var t = this._children; if (t && t.length === 1) { var n = t[0].reduce(e); return this._parent ? (n.insertAbove(this), this.remove()) : n.remove(), n } return this }, _removeNamed: function() { var e = this._getOwner(); if (e) { var t = e._children , n = e._namedChildren , i = this._name , r = n[i] , s = r ? r.indexOf(this) : -1; s !== -1 && (t[i] == this && delete t[i], r.splice(s, 1), r.length ? t[i] = r[0] : delete n[i]) } }, _remove: function(e, t) { var n = this._getOwner() , i = this._project , r = this._index; return this._style && this._style._dispose(), n ? (this._name && this._removeNamed(), r != null && (i._activeLayer === this && (i._activeLayer = this.getNextSibling() || this.getPreviousSibling()), d.splice(n._children, null, r, 1)), this._installEvents(!1), e && i._changes && this._changed(5), t && n._changed(11, this), this._parent = null, !0) : !1 }, remove: function() { return this._remove(!0, !0) }, replaceWith: function(e) { var t = e && e.insertBelow(this); return t && this.remove(), t }, removeChildren: function(e, t) { if (!this._children) return null; e = e || 0, t = d.pick(t, this._children.length); for (var n = d.splice(this._children, null, e, t - e), i = n.length - 1; i >= 0; i--) n[i]._remove(!0, !1); return n.length > 0 && this._changed(11), n }, clear: "#removeChildren", reverseChildren: function() { if (this._children) { this._children.reverse(); for (var e = 0, t = this._children.length; e < t; e++) this._children[e]._index = e; this._changed(11) } }, isEmpty: function(e) { var t = this._children , n = t ? t.length : 0; if (e) { for (var i = 0; i < n; i++) if (!t[i].isEmpty(e)) return !1; return !0 } return !n }, isEditable: function() { for (var e = this; e; ) { if (!e._visible || e._locked) return !1; e = e._parent } return !0 }, hasFill: function() { return this.getStyle().hasFill() }, hasStroke: function() { return this.getStyle().hasStroke() }, hasShadow: function() { return this.getStyle().hasShadow() }, _getOrder: function(e) { function t(u) { var o = []; do o.unshift(u); while (u = u._parent); return o } for (var n = t(this), i = t(e), r = 0, s = Math.min(n.length, i.length); r < s; r++) if (n[r] != i[r]) return n[r]._index < i[r]._index ? 1 : -1; return 0 }, hasChildren: function() { return this._children && this._children.length > 0 }, isInserted: function() { return this._parent ? this._parent.isInserted() : !1 }, isAbove: function(e) { return this._getOrder(e) === -1 }, isBelow: function(e) { return this._getOrder(e) === 1 }, isParent: function(e) { return this._parent === e }, isChild: function(e) { return e && e._parent === this }, isDescendant: function(e) { for (var t = this; t = t._parent; ) if (t === e) return !0; return !1 }, isAncestor: function(e) { return e ? e.isDescendant(this) : !1 }, isSibling: function(e) { return this._parent === e._parent }, isGroupedWith: function(e) { for (var t = this._parent; t; ) { if (t._parent && /^(Group|Layer|CompoundPath)$/.test(t._class) && e.isDescendant(t)) return !0; t = t._parent } return !1 } }, d.each(["rotate", "scale", "shear", "skew"], function(e) { var t = e === "rotate"; this[e] = function() { var n = arguments , i = (t ? d : C).read(n) , r = C.read(n, 0, { readNull: !0 }); return this.transform(new le()[e](i, r || this.getPosition(!0))) } }, { translate: function() { var e = new le; return this.transform(e.translate.apply(e, arguments)) }, transform: function(e, t, n) { var i = this._matrix , r = e && !e.isIdentity() , s = n && this._canApplyMatrix || this._applyMatrix && (r || !i.isIdentity() || t && this._children); if (!r && !s) return this; if (r) { !e.isInvertible() && i.isInvertible() && (i._backup = i.getValues()), i.prepend(e, !0); var u = this._style , o = u.getFillColor(!0) , l = u.getStrokeColor(!0); o && o.transform(e), l && l.transform(e) } if (s && (s = this._transformContent(i, t, n))) { var f = this._pivot; f && i._transformPoint(f, f, !0), i.reset(!0), n && this._canApplyMatrix && (this._applyMatrix = !0) } var g = this._bounds , y = this._position; (r || s) && this._changed(25); var _ = r && g && e.decompose(); if (_ && _.skewing.isZero() && _.rotation % 90 === 0) { for (var v in g) { var b = g[v]; if (b.nonscaling) delete g[v]; else if (s || !b.internal) { var T = b.rect; e._transformBounds(T, T) } } this._bounds = g; var x = g[this._getBoundsCacheKey(this._boundsOptions || {})]; x && (this._position = this._getPositionFromBounds(x.rect)) } else r && y && this._pivot && (this._position = e._transformPoint(y, y)); return this }, _transformContent: function(e, t, n) { var i = this._children; if (i) { for (var r = 0, s = i.length; r < s; r++) i[r].transform(e, t, n); return !0 } }, globalToLocal: function() { return this.getGlobalMatrix(!0)._inverseTransform(C.read(arguments)) }, localToGlobal: function() { return this.getGlobalMatrix(!0)._transformPoint(C.read(arguments)) }, parentToLocal: function() { return this._matrix._inverseTransform(C.read(arguments)) }, localToParent: function() { return this._matrix._transformPoint(C.read(arguments)) }, fitBounds: function(e, t) { e = Y.read(arguments); var n = this.getBounds() , i = n.height / n.width , r = e.height / e.width , s = (t ? i > r : i < r) ? e.width / n.width : e.height / n.height , u = new Y(new C,new J(n.width * s,n.height * s)); u.setCenter(e.getCenter()), this.setBounds(u) } }), { _setStyles: function(e, t, n) { var i = this._style , r = this._matrix; if (i.hasFill() && (e.fillStyle = i.getFillColor().toCanvasStyle(e, r)), i.hasStroke()) { e.strokeStyle = i.getStrokeColor().toCanvasStyle(e, r), e.lineWidth = i.getStrokeWidth(); var s = i.getStrokeJoin() , u = i.getStrokeCap() , o = i.getMiterLimit(); if (s && (e.lineJoin = s), u && (e.lineCap = u), o && (e.miterLimit = o), ae.support.nativeDash) { var l = i.getDashArray() , f = i.getDashOffset(); l && l.length && ("setLineDash"in e ? (e.setLineDash(l), e.lineDashOffset = f) : (e.mozDash = l, e.mozDashOffset = f)) } } if (i.hasShadow()) { var g = t.pixelRatio || 1 , y = n._shiftless().prepend(new le().scale(g, g)) , _ = y.transform(new C(i.getShadowBlur(),0)) , v = y.transform(this.getShadowOffset()); e.shadowColor = i.getShadowColor().toCanvasStyle(e), e.shadowBlur = _.getLength(), e.shadowOffsetX = v.x, e.shadowOffsetY = v.y } }, draw: function(e, t, n) { var i = this._updateVersion = this._project._updateVersion; if (!(!this._visible || this._opacity === 0)) { var r = t.matrices , s = t.viewMatrix , u = this._matrix , o = r[r.length - 1].appended(u); if (o.isInvertible()) { s = s ? s.appended(o) : o, r.push(o), t.updateMatrix && (this._globalMatrix = o); var l = this._blendMode, f = O.clamp(this._opacity, 0, 1), g = l === "normal", y = nn.nativeModes[l], _ = g && f === 1 || t.dontStart || t.clip || (y || g && f < 1) && this._canComposite(), v = t.pixelRatio || 1, b, T, x; if (!_) { var S = this.getStrokeBounds(s); if (!S.width || !S.height) { r.pop(); return } x = t.offset, T = t.offset = S.getTopLeft().floor(), b = e, e = Je.getContext(S.getSize().ceil().add(1).multiply(v)), v !== 1 && e.scale(v, v) } e.save(); var I = n ? n.appended(u) : this._canScaleStroke && !this.getStrokeScaling(!0) && s , m = !_ && t.clipItem , w = !I || m; if (_ ? (e.globalAlpha = f, y && (e.globalCompositeOperation = l)) : w && e.translate(-T.x, -T.y), w && (_ ? u : s).applyToContext(e), m && t.clipItem.draw(e, t.extend({ clip: !0 })), I) { e.setTransform(v, 0, 0, v, 0, 0); var E = t.offset; E && e.translate(-E.x, -E.y) } this._draw(e, t, s, I), e.restore(), r.pop(), t.clip && !t.dontFinish && e.clip(this.getFillRule()), _ || (nn.process(l, e, b, f, T.subtract(x).multiply(v)), Je.release(e), t.offset = x) } } }, _isUpdated: function(e) { var t = this._parent; if (t instanceof ot) return t._isUpdated(e); var n = this._updateVersion === e; return !n && t && t._visible && t._isUpdated(e) && (this._updateVersion = e, n = !0), n }, _drawSelection: function(e, t, n, i, r) { var s = this._selection , u = s & 1 , o = s & 2 || u && this._selectBounds , l = s & 4; if (this._drawSelected || (u = !1), (u || o || l) && this._isUpdated(r)) { var f, g = this.getSelectedColor(!0) || (f = this.getLayer()) && f.getSelectedColor(!0), y = t.appended(this.getGlobalMatrix(!0)), _ = n / 2; if (e.strokeStyle = e.fillStyle = g ? g.toCanvasStyle(e) : "#009dec", u && this._drawSelected(e, y, i), l) { var v = this.getPosition(!0) , b = this._parent , T = b ? b.localToGlobal(v) : v , x = T.x , S = T.y; e.beginPath(), e.arc(x, S, _, 0, Math.PI * 2, !0), e.stroke(); for (var I = [[0, -1], [1, 0], [0, 1], [-1, 0]], m = _, w = n + 1, E = 0; E < 4; E++) { var A = I[E] , N = A[0] , L = A[1]; e.moveTo(x + N * m, S + L * m), e.lineTo(x + N * w, S + L * w), e.stroke() } } if (o) { var R = y._transformCorners(this.getInternalBounds()); e.beginPath(); for (var E = 0; E < 8; E++) e[E ? "lineTo" : "moveTo"](R[E], R[++E]); e.closePath(), e.stroke(); for (var E = 0; E < 8; E++) e.fillRect(R[E] - _, R[++E] - _, n, n) } } }, _canComposite: function() { return !1 } }, d.each(["down", "drag", "up", "move"], function(e) { this["removeOn" + d.capitalize(e)] = function() { var t = {}; return t[e] = !0, this.removeOn(t) } }, { removeOn: function(e) { for (var t in e) if (e[t]) { var n = "mouse" + t , i = this._project , r = i._removeSets = i._removeSets || {}; r[n] = r[n] || {}, r[n][this._id] = this } return this } }), { tween: function(e, t, n) { n || (n = t, t = e, e = null, n || (n = t, t = null)); var i = n && n.easing , r = n && n.start , s = n != null && (typeof n == "number" ? n : n.duration) , u = new Sn(this,e,t,s,i,r); function o(l) { u._handleFrame(l.time * 1e3), u.running || this.off("frame", o) } return s && this.on("frame", o), u }, tweenTo: function(e, t) { return this.tween(null, e, t) }, tweenFrom: function(e, t) { return this.tween(e, null, t) } }) , We = oe.extend({ _class: "Group", _selectBounds: !1, _selectChildren: !0, _serializeFields: { children: [] }, initialize: function(t) { this._children = [], this._namedChildren = {}, this._initialize(t) || this.addChildren(Array.isArray(t) ? t : arguments) }, _changed: function e(t) { e.base.call(this, t), t & 2050 && (this._clipItem = a) }, _getClipItem: function() { var e = this._clipItem; if (e === a) { e = null; for (var t = this._children, n = 0, i = t.length; n < i; n++) if (t[n]._clipMask) { e = t[n]; break } this._clipItem = e } return e }, isClipped: function() { return !!this._getClipItem() }, setClipped: function(e) { var t = this.getFirstChild(); t && t.setClipMask(e) }, _getBounds: function e(t, n) { var i = this._getClipItem(); return i ? i._getCachedBounds(i._matrix.prepended(t), d.set({}, n, { stroke: !1 })) : e.base.call(this, t, n) }, _hitTestChildren: function e(t, n, i) { var r = this._getClipItem(); return (!r || r.contains(t)) && e.base.call(this, t, n, i, r) }, _draw: function(e, t) { var n = t.clip , i = !n && this._getClipItem(); t = t.extend({ clipItem: i, clip: !1 }), n ? (e.beginPath(), t.dontStart = t.dontFinish = !0) : i && i.draw(e, t.extend({ clip: !0 })); for (var r = this._children, s = 0, u = r.length; s < u; s++) { var o = r[s]; o !== i && o.draw(e, t) } } }) , ct = We.extend({ _class: "Layer", initialize: function() { We.apply(this, arguments) }, _getOwner: function() { return this._parent || this._index != null && this._project }, isInserted: function e() { return this._parent ? e.base.call(this) : this._index != null }, activate: function() { this._project._activeLayer = this }, _hitTestSelf: function() {} }) , je = oe.extend({ _class: "Shape", _applyMatrix: !1, _canApplyMatrix: !1, _canScaleStroke: !0, _serializeFields: { type: null, size: null, radius: null }, initialize: function(t, n) { this._initialize(t, n) }, _equals: function(e) { return this._type === e._type && this._size.equals(e._size) && d.equals(this._radius, e._radius) }, copyContent: function(e) { this.setType(e._type), this.setSize(e._size), this.setRadius(e._radius) }, getType: function() { return this._type }, setType: function(e) { this._type = e }, getShape: "#getType", setShape: "#setType", getSize: function() { var e = this._size; return new ne(e.width,e.height,this,"setSize") }, setSize: function() { var e = J.read(arguments); if (!this._size) this._size = e.clone(); else if (!this._size.equals(e)) { var t = this._type , n = e.width , i = e.height; t === "rectangle" ? this._radius.set(J.min(this._radius, e.divide(2).abs())) : t === "circle" ? (n = i = (n + i) / 2, this._radius = n / 2) : t === "ellipse" && this._radius._set(n / 2, i / 2), this._size._set(n, i), this._changed(9) } }, getRadius: function() { var e = this._radius; return this._type === "circle" ? e : new ne(e.width,e.height,this,"setRadius") }, setRadius: function(e) { var t = this._type; if (t === "circle") { if (e === this._radius) return; var n = e * 2; this._radius = e, this._size._set(n, n) } else if (e = J.read(arguments), !this._radius) this._radius = e.clone(); else { if (this._radius.equals(e)) return; if (this._radius.set(e), t === "rectangle") { var n = J.max(this._size, e.multiply(2)); this._size.set(n) } else t === "ellipse" && this._size._set(e.width * 2, e.height * 2) } this._changed(9) }, isEmpty: function() { return !1 }, toPath: function(e) { var t = new ke[d.capitalize(this._type)]({ center: new C, size: this._size, radius: this._radius, insert: !1 }); return t.copyAttributes(this), ae.settings.applyMatrix && t.setApplyMatrix(!0), (e === a || e) && t.insertAbove(this), t }, toShape: "#clone", _asPathItem: function() { return this.toPath(!1) }, _draw: function(e, t, n, i) { var r = this._style , s = r.hasFill() , u = r.hasStroke() , o = t.dontFinish || t.clip , l = !i; if (s || u || o) { var f = this._type , g = this._radius , y = f === "circle"; if (t.dontStart || e.beginPath(), l && y) e.arc(0, 0, g, 0, Math.PI * 2, !0); else { var _ = y ? g : g.width , v = y ? g : g.height , b = this._size , T = b.width , x = b.height; if (l && f === "rectangle" && _ === 0 && v === 0) e.rect(-T / 2, -x / 2, T, x); else { var S = T / 2 , I = x / 2 , m = 1 - .5522847498307936 , w = _ * m , E = v * m , A = [-S, -I + v, -S, -I + E, -S + w, -I, -S + _, -I, S - _, -I, S - w, -I, S, -I + E, S, -I + v, S, I - v, S, I - E, S - w, I, S - _, I, -S + _, I, -S + w, I, -S, I - E, -S, I - v]; i && i.transform(A, A, 32), e.moveTo(A[0], A[1]), e.bezierCurveTo(A[2], A[3], A[4], A[5], A[6], A[7]), S !== _ && e.lineTo(A[8], A[9]), e.bezierCurveTo(A[10], A[11], A[12], A[13], A[14], A[15]), I !== v && e.lineTo(A[16], A[17]), e.bezierCurveTo(A[18], A[19], A[20], A[21], A[22], A[23]), S !== _ && e.lineTo(A[24], A[25]), e.bezierCurveTo(A[26], A[27], A[28], A[29], A[30], A[31]) } } e.closePath() } !o && (s || u) && (this._setStyles(e, t, n), s && (e.fill(r.getFillRule()), e.shadowColor = "rgba(0,0,0,0)"), u && e.stroke()) }, _canComposite: function() { return !(this.hasFill() && this.hasStroke()) }, _getBounds: function(e, t) { var n = new Y(this._size).setCenter(0, 0) , i = this._style , r = t.stroke && i.hasStroke() && i.getStrokeWidth(); return e && (n = e._transformBounds(n)), r ? n.expand(ke._getStrokePadding(r, this._getStrokeMatrix(e, t))) : n } }, new function() { function e(n, i, r) { var s = n._radius; if (!s.isZero()) for (var u = n._size.divide(2), o = 1; o <= 4; o++) { var l = new C(o > 1 && o < 4 ? -1 : 1,o > 2 ? -1 : 1) , f = l.multiply(u) , g = f.subtract(l.multiply(s)) , y = new Y(r ? f.add(l.multiply(r)) : f,g); if (y.contains(i)) return { point: g, quadrant: o } } } function t(n, i, r, s) { var u = n.divide(i); return (!s || u.isInQuadrant(s)) && u.subtract(u.normalize()).multiply(i).divide(r).length <= 1 } return { _contains: function n(i) { if (this._type === "rectangle") { var r = e(this, i); return r ? i.subtract(r.point).divide(this._radius).getLength() <= 1 : n.base.call(this, i) } else return i.divide(this.size).getLength() <= .5 }, _hitTestSelf: function n(i, r, s, u) { var o = !1 , l = this._style , f = r.stroke && l.hasStroke() , g = r.fill && l.hasFill(); if (f || g) { var y = this._type , _ = this._radius , v = f ? l.getStrokeWidth() / 2 : 0 , b = r._tolerancePadding.add(ke._getStrokePadding(v, !l.getStrokeScaling() && u)); if (y === "rectangle") { var T = b.multiply(2) , x = e(this, i, T); if (x) o = t(i.subtract(x.point), _, b, x.quadrant); else { var S = new Y(this._size).setCenter(0, 0) , I = S.expand(T) , m = S.expand(T.negate()); o = I._containsPoint(i) && !m._containsPoint(i) } } else o = t(i, _, b) } return o ? new qe(f ? "stroke" : "fill",this) : n.base.apply(this, arguments) } } } , { statics: new function() { function e(t, n, i, r, s) { var u = d.create(je.prototype); return u._type = t, u._size = i, u._radius = r, u._initialize(d.getNamed(s), n), u } return { Circle: function() { var t = arguments , n = C.readNamed(t, "center") , i = d.readNamed(t, "radius"); return e("circle", n, new J(i * 2), i, t) }, Rectangle: function() { var t = arguments , n = Y.readNamed(t, "rectangle") , i = J.min(J.readNamed(t, "radius"), n.getSize(!0).divide(2)); return e("rectangle", n.getCenter(!0), n.getSize(!0), i, t) }, Ellipse: function() { var t = arguments , n = je._readEllipse(t) , i = n.radius; return e("ellipse", n.center, i.multiply(2), i, t) }, _readEllipse: function(t) { var n, i; if (d.hasNamed(t, "radius")) n = C.readNamed(t, "center"), i = J.readNamed(t, "radius"); else { var r = Y.readNamed(t, "rectangle"); n = r.getCenter(!0), i = r.getSize(!0).divide(2) } return { center: n, radius: i } } } } }) , Pt = oe.extend({ _class: "Raster", _applyMatrix: !1, _canApplyMatrix: !1, _boundsOptions: { stroke: !1, handle: !1 }, _serializeFields: { crossOrigin: null, source: null }, _prioritize: ["crossOrigin"], _smoothing: "low", beans: !0, initialize: function(t, n) { if (!this._initialize(t, n !== a && C.read(arguments))) { var i, r = typeof t, s = r === "string" ? p.getElementById(t) : r === "object" ? t : null; if (s && s !== oe.NO_INSERT) { if (s.getContext || s.naturalHeight != null) i = s; else if (s) { var u = J.read(arguments); u.isZero() || (i = Je.getCanvas(u)) } } i ? this.setImage(i) : this.setSource(t) } this._size || (this._size = new J, this._loaded = !1) }, _equals: function(e) { return this.getSource() === e.getSource() }, copyContent: function(e) { var t = e._image , n = e._canvas; if (t) this._setImage(t); else if (n) { var i = Je.getCanvas(e._size); i.getContext("2d").drawImage(n, 0, 0), this._setImage(i) } this._crossOrigin = e._crossOrigin }, getSize: function() { var e = this._size; return new ne(e ? e.width : 0,e ? e.height : 0,this,"setSize") }, setSize: function(e, t) { var n = J.read(arguments); if (n.equals(this._size)) t && this.clear(); else if (n.width > 0 && n.height > 0) { var i = !t && this.getElement(); this._setImage(Je.getCanvas(n)), i && this.getContext(!0).drawImage(i, 0, 0, n.width, n.height) } else this._canvas && Je.release(this._canvas), this._size = n.clone() }, getWidth: function() { return this._size ? this._size.width : 0 }, setWidth: function(e) { this.setSize(e, this.getHeight()) }, getHeight: function() { return this._size ? this._size.height : 0 }, setHeight: function(e) { this.setSize(this.getWidth(), e) }, getLoaded: function() { return this._loaded }, isEmpty: function() { var e = this._size; return !e || e.width === 0 && e.height === 0 }, getResolution: function() { var e = this._matrix , t = new C(0,0).transform(e) , n = new C(1,0).transform(e).subtract(t) , i = new C(0,1).transform(e).subtract(t); return new J(72 / n.getLength(),72 / i.getLength()) }, getPpi: "#getResolution", getImage: function() { return this._image }, setImage: function(e) { var t = this; function n(i) { var r = t.getView() , s = i && i.type || "load"; r && t.responds(s) && (ae = r._scope, t.emit(s, new Zt(i))) } this._setImage(e), this._loaded ? setTimeout(n, 0) : e && tt.add(e, { load: function(i) { t._setImage(e), n(i) }, error: n }) }, _setImage: function(e) { this._canvas && Je.release(this._canvas), e && e.getContext ? (this._image = null, this._canvas = e, this._loaded = !0) : (this._image = e, this._canvas = null, this._loaded = !!(e && e.src && e.complete)), this._size = new J(e ? e.naturalWidth || e.width : 0,e ? e.naturalHeight || e.height : 0), this._context = null, this._changed(1033) }, getCanvas: function() { if (!this._canvas) { var e = Je.getContext(this._size); try { this._image && e.drawImage(this._image, 0, 0), this._canvas = e.canvas } catch { Je.release(e) } } return this._canvas }, setCanvas: "#setImage", getContext: function(e) { return this._context || (this._context = this.getCanvas().getContext("2d")), e && (this._image = null, this._changed(1025)), this._context }, setContext: function(e) { this._context = e }, getSource: function() { var e = this._image; return e && e.src || this.toDataURL() }, setSource: function(e) { var t = new c.Image , n = this._crossOrigin; n && (t.crossOrigin = n), e && (t.src = e), this.setImage(t) }, getCrossOrigin: function() { var e = this._image; return e && e.crossOrigin || this._crossOrigin || "" }, setCrossOrigin: function(e) { this._crossOrigin = e; var t = this._image; t && (t.crossOrigin = e) }, getSmoothing: function() { return this._smoothing }, setSmoothing: function(e) { this._smoothing = typeof e == "string" ? e : e ? "low" : "off", this._changed(257) }, getElement: function() { return this._canvas || this._loaded && this._image } }, { beans: !1, getSubCanvas: function() { var e = Y.read(arguments) , t = Je.getContext(e.getSize()); return t.drawImage(this.getCanvas(), e.x, e.y, e.width, e.height, 0, 0, e.width, e.height), t.canvas }, getSubRaster: function() { var e = Y.read(arguments) , t = new Pt(oe.NO_INSERT); return t._setImage(this.getSubCanvas(e)), t.translate(e.getCenter().subtract(this.getSize().divide(2))), t._matrix.prepend(this._matrix), t.insertAbove(this), t }, toDataURL: function() { var e = this._image , t = e && e.src; if (/^data:/.test(t)) return t; var n = this.getCanvas(); return n ? n.toDataURL.apply(n, arguments) : null }, drawImage: function(e) { var t = C.read(arguments, 1); this.getContext(!0).drawImage(e, t.x, t.y) }, getAverageColor: function(e) { var t, n; if (e ? e instanceof Ft ? (n = e, t = e.getBounds()) : typeof e == "object" && ("width"in e ? t = new Y(e) : "x"in e && (t = new Y(e.x - .5,e.y - .5,1,1))) : t = this.getBounds(), !t) return null; var i = 32 , r = Math.min(t.width, i) , s = Math.min(t.height, i) , u = Pt._sampleContext; u ? u.clearRect(0, 0, i + 1, i + 1) : u = Pt._sampleContext = Je.getContext(new J(i)), u.save(); var o = new le().scale(r / t.width, s / t.height).translate(-t.x, -t.y); o.applyToContext(u), n && n.draw(u, new d({ clip: !0, matrices: [o] })), this._matrix.applyToContext(u); var l = this.getElement() , f = this._size; l && u.drawImage(l, -f.width / 2, -f.height / 2), u.restore(); for (var g = u.getImageData(.5, .5, Math.ceil(r), Math.ceil(s)).data, y = [0, 0, 0], _ = 0, v = 0, b = g.length; v < b; v += 4) { var T = g[v + 3]; _ += T, T /= 255, y[0] += g[v] * T, y[1] += g[v + 1] * T, y[2] += g[v + 2] * T } for (var v = 0; v < 3; v++) y[v] /= _; return _ ? Xe.read(y) : null }, getPixel: function() { var e = C.read(arguments) , t = this.getContext().getImageData(e.x, e.y, 1, 1).data; return new Xe("rgb",[t[0] / 255, t[1] / 255, t[2] / 255],t[3] / 255) }, setPixel: function() { var e = arguments , t = C.read(e) , n = Xe.read(e) , i = n._convert("rgb") , r = n._alpha , s = this.getContext(!0) , u = s.createImageData(1, 1) , o = u.data; o[0] = i[0] * 255, o[1] = i[1] * 255, o[2] = i[2] * 255, o[3] = r != null ? r * 255 : 255, s.putImageData(u, t.x, t.y) }, clear: function() { var e = this._size; this.getContext(!0).clearRect(0, 0, e.width + 1, e.height + 1) }, createImageData: function() { var e = J.read(arguments); return this.getContext().createImageData(e.width, e.height) }, getImageData: function() { var e = Y.read(arguments); return e.isEmpty() && (e = new Y(this._size)), this.getContext().getImageData(e.x, e.y, e.width, e.height) }, putImageData: function(e) { var t = C.read(arguments, 1); this.getContext(!0).putImageData(e, t.x, t.y) }, setImageData: function(e) { this.setSize(e), this.getContext(!0).putImageData(e, 0, 0) }, _getBounds: function(e, t) { var n = new Y(this._size).setCenter(0, 0); return e ? e._transformBounds(n) : n }, _hitTestSelf: function(e) { if (this._contains(e)) { var t = this; return new qe("pixel",t,{ offset: e.add(t._size.divide(2)).round(), color: { get: function() { return t.getPixel(this.offset) } } }) } }, _draw: function(e, t, n) { var i = this.getElement(); if (i && i.width > 0 && i.height > 0) { e.globalAlpha = O.clamp(this._opacity, 0, 1), this._setStyles(e, t, n); var r = this._smoothing , s = r === "off"; Ce.setPrefixed(e, s ? "imageSmoothingEnabled" : "imageSmoothingQuality", s ? !1 : r), e.drawImage(i, -this._size.width / 2, -this._size.height / 2) } }, _canComposite: function() { return !0 } }) , ft = oe.extend({ _class: "SymbolItem", _applyMatrix: !1, _canApplyMatrix: !1, _boundsOptions: { stroke: !0 }, _serializeFields: { symbol: null }, initialize: function(t, n) { this._initialize(t, n !== a && C.read(arguments, 1)) || this.setDefinition(t instanceof dt ? t : new dt(t)) }, _equals: function(e) { return this._definition === e._definition }, copyContent: function(e) { this.setDefinition(e._definition) }, getDefinition: function() { return this._definition }, setDefinition: function(e) { this._definition = e, this._changed(9) }, getSymbol: "#getDefinition", setSymbol: "#setDefinition", isEmpty: function() { return this._definition._item.isEmpty() }, _getBounds: function(e, t) { var n = this._definition._item; return n._getCachedBounds(n._matrix.prepended(e), t) }, _hitTestSelf: function(e, t, n) { var i = t.extend({ all: !1 }) , r = this._definition._item._hitTest(e, i, n); return r && (r.item = this), r }, _draw: function(e, t) { this._definition._item.draw(e, t) } }) , dt = d.extend({ _class: "SymbolDefinition", initialize: function(t, n) { this._id = B.get(), this.project = ae.project, t && this.setItem(t, n) }, _serialize: function(e, t) { return t.add(this, function() { return d.serialize([this._class, this._item], e, !1, t) }) }, _changed: function(e) { e & 8 && oe._clearBoundsCache(this), e & 1 && this.project._changed(e) }, getItem: function() { return this._item }, setItem: function(e, t) { e._symbol && (e = e.clone()), this._item && (this._item._symbol = null), this._item = e, e.remove(), e.setSelected(!1), t || e.setPosition(new C), e._symbol = this, this._changed(9) }, getDefinition: "#getItem", setDefinition: "#setItem", place: function(e) { return new ft(this,e) }, clone: function() { return new dt(this._item.clone(!1)) }, equals: function(e) { return e === this || e && this._item.equals(e._item) || !1 } }) , qe = d.extend({ _class: "HitResult", initialize: function(t, n, i) { this.type = t, this.item = n, i && this.inject(i) }, statics: { getOptions: function(e) { var t = e && d.read(e); return new d({ type: null, tolerance: ae.settings.hitTolerance, fill: !t, stroke: !t, segments: !t, handles: !1, ends: !1, position: !1, center: !1, bounds: !1, guides: !1, selected: !1 },t) } } }) , pe = d.extend({ _class: "Segment", beans: !0, _selection: 0, initialize: function(t, n, i, r, s, u) { var o = arguments.length, l, f, g, y; o > 0 && (t == null || typeof t == "object" ? o === 1 && t && "point"in t ? (l = t.point, f = t.handleIn, g = t.handleOut, y = t.selection) : (l = t, f = n, g = i, y = r) : (l = [t, n], f = i !== a ? [i, r] : null, g = s !== a ? [s, u] : null)), new Vt(l,this,"_point"), new Vt(f,this,"_handleIn"), new Vt(g,this,"_handleOut"), y && this.setSelection(y) }, _serialize: function(e, t) { var n = this._point , i = this._selection , r = i || this.hasHandles() ? [n, this._handleIn, this._handleOut] : n; return i && r.push(i), d.serialize(r, e, !0, t) }, _changed: function(e) { var t = this._path; if (t) { var n = t._curves, i = this._index, r; n && ((!e || e === this._point || e === this._handleIn) && (r = i > 0 ? n[i - 1] : t._closed ? n[n.length - 1] : null) && r._changed(), (!e || e === this._point || e === this._handleOut) && (r = n[i]) && r._changed()), t._changed(41) } }, getPoint: function() { return this._point }, setPoint: function() { this._point.set(C.read(arguments)) }, getHandleIn: function() { return this._handleIn }, setHandleIn: function() { this._handleIn.set(C.read(arguments)) }, getHandleOut: function() { return this._handleOut }, setHandleOut: function() { this._handleOut.set(C.read(arguments)) }, hasHandles: function() { return !this._handleIn.isZero() || !this._handleOut.isZero() }, isSmooth: function() { var e = this._handleIn , t = this._handleOut; return !e.isZero() && !t.isZero() && e.isCollinear(t) }, clearHandles: function() { this._handleIn._set(0, 0), this._handleOut._set(0, 0) }, getSelection: function() { return this._selection }, setSelection: function(e) { var t = this._selection , n = this._path; this._selection = e = e || 0, n && e !== t && (n._updateSelection(this, t, e), n._changed(257)) }, _changeSelection: function(e, t) { var n = this._selection; this.setSelection(t ? n | e : n & ~e) }, isSelected: function() { return !!(this._selection & 7) }, setSelected: function(e) { this._changeSelection(7, e) }, getIndex: function() { return this._index !== a ? this._index : null }, getPath: function() { return this._path || null }, getCurve: function() { var e = this._path , t = this._index; return e ? (t > 0 && !e._closed && t === e._segments.length - 1 && t--, e.getCurves()[t] || null) : null }, getLocation: function() { var e = this.getCurve(); return e ? new Ot(e,this === e._segment1 ? 0 : 1) : null }, getNext: function() { var e = this._path && this._path._segments; return e && (e[this._index + 1] || this._path._closed && e[0]) || null }, smooth: function(e, t, n) { var i = e || {} , r = i.type , s = i.factor , u = this.getPrevious() , o = this.getNext() , l = (u || this)._point , f = this._point , g = (o || this)._point , y = l.getDistance(f) , _ = f.getDistance(g); if (!r || r === "catmull-rom") { var v = s === a ? .5 : s , b = Math.pow(y, v) , T = b * b , x = Math.pow(_, v) , S = x * x; if (!t && u) { var I = 2 * S + 3 * x * b + T , m = 3 * x * (x + b); this.setHandleIn(m !== 0 ? new C((S * l._x + I * f._x - T * g._x) / m - f._x,(S * l._y + I * f._y - T * g._y) / m - f._y) : new C) } if (!n && o) { var I = 2 * T + 3 * b * x + S , m = 3 * b * (b + x); this.setHandleOut(m !== 0 ? new C((T * g._x + I * f._x - S * l._x) / m - f._x,(T * g._y + I * f._y - S * l._y) / m - f._y) : new C) } } else if (r === "geometric") { if (u && o) { var w = l.subtract(g) , E = s === a ? .4 : s , A = E * y / (y + _); t || this.setHandleIn(w.multiply(A)), n || this.setHandleOut(w.multiply(A - E)) } } else throw new Error("Smoothing method '" + r + "' not supported.") }, getPrevious: function() { var e = this._path && this._path._segments; return e && (e[this._index - 1] || this._path._closed && e[e.length - 1]) || null }, isFirst: function() { return !this._index }, isLast: function() { var e = this._path; return e && this._index === e._segments.length - 1 || !1 }, reverse: function() { var e = this._handleIn , t = this._handleOut , n = e.clone(); e.set(t), t.set(n) }, reversed: function() { return new pe(this._point,this._handleOut,this._handleIn) }, remove: function() { return this._path ? !!this._path.removeSegment(this._index) : !1 }, clone: function() { return new pe(this._point,this._handleIn,this._handleOut) }, equals: function(e) { return e === this || e && this._class === e._class && this._point.equals(e._point) && this._handleIn.equals(e._handleIn) && this._handleOut.equals(e._handleOut) || !1 }, toString: function() { var e = ["point: " + this._point]; return this._handleIn.isZero() || e.push("handleIn: " + this._handleIn), this._handleOut.isZero() || e.push("handleOut: " + this._handleOut), "{ " + e.join(", ") + " }" }, transform: function(e) { this._transformCoordinates(e, new Array(6), !0), this._changed() }, interpolate: function(e, t, n) { var i = 1 - n , r = n , s = e._point , u = t._point , o = e._handleIn , l = t._handleIn , f = t._handleOut , g = e._handleOut; this._point._set(i * s._x + r * u._x, i * s._y + r * u._y, !0), this._handleIn._set(i * o._x + r * l._x, i * o._y + r * l._y, !0), this._handleOut._set(i * g._x + r * f._x, i * g._y + r * f._y, !0), this._changed() }, _transformCoordinates: function(e, t, n) { var i = this._point , r = !n || !this._handleIn.isZero() ? this._handleIn : null , s = !n || !this._handleOut.isZero() ? this._handleOut : null , u = i._x , o = i._y , l = 2; return t[0] = u, t[1] = o, r && (t[l++] = r._x + u, t[l++] = r._y + o), s && (t[l++] = s._x + u, t[l++] = s._y + o), e && (e._transformCoordinates(t, t, l / 2), u = t[0], o = t[1], n ? (i._x = u, i._y = o, l = 2, r && (r._x = t[l++] - u, r._y = t[l++] - o), s && (s._x = t[l++] - u, s._y = t[l++] - o)) : (r || (t[l++] = u, t[l++] = o), s || (t[l++] = u, t[l++] = o))), t } }) , Vt = C.extend({ initialize: function(t, n, i) { var r, s, u; if (!t) r = s = 0; else if ((r = t[0]) !== a) s = t[1]; else { var o = t; (r = o.x) === a && (o = C.read(arguments), r = o.x), s = o.y, u = o.selected } this._x = r, this._y = s, this._owner = n, n[i] = this, u && this.setSelected(!0) }, _set: function(e, t) { return this._x = e, this._y = t, this._owner._changed(this), this }, getX: function() { return this._x }, setX: function(e) { this._x = e, this._owner._changed(this) }, getY: function() { return this._y }, setY: function(e) { this._y = e, this._owner._changed(this) }, isZero: function() { var e = O.isZero; return e(this._x) && e(this._y) }, isSelected: function() { return !!(this._owner._selection & this._getSelection()) }, setSelected: function(e) { this._owner._changeSelection(this._getSelection(), e) }, _getSelection: function() { var e = this._owner; return this === e._point ? 1 : this === e._handleIn ? 2 : this === e._handleOut ? 4 : 0 } }) , re = d.extend({ _class: "Curve", beans: !0, initialize: function(t, n, i, r, s, u, o, l) { var f = arguments.length, g, y, _, v, b, T; f === 3 ? (this._path = t, g = n, y = i) : f ? f === 1 ? "segment1"in t ? (g = new pe(t.segment1), y = new pe(t.segment2)) : "point1"in t ? (_ = t.point1, b = t.handle1, T = t.handle2, v = t.point2) : Array.isArray(t) && (_ = [t[0], t[1]], v = [t[6], t[7]], b = [t[2] - t[0], t[3] - t[1]], T = [t[4] - t[6], t[5] - t[7]]) : f === 2 ? (g = new pe(t), y = new pe(n)) : f === 4 ? (_ = t, b = n, T = i, v = r) : f === 8 && (_ = [t, n], v = [o, l], b = [i - t, r - n], T = [s - o, u - l]) : (g = new pe, y = new pe), this._segment1 = g || new pe(_,null,b), this._segment2 = y || new pe(v,T,null) }, _serialize: function(e, t) { return d.serialize(this.hasHandles() ? [this.getPoint1(), this.getHandle1(), this.getHandle2(), this.getPoint2()] : [this.getPoint1(), this.getPoint2()], e, !0, t) }, _changed: function() { this._length = this._bounds = a }, clone: function() { return new re(this._segment1,this._segment2) }, toString: function() { var e = ["point1: " + this._segment1._point]; return this._segment1._handleOut.isZero() || e.push("handle1: " + this._segment1._handleOut), this._segment2._handleIn.isZero() || e.push("handle2: " + this._segment2._handleIn), e.push("point2: " + this._segment2._point), "{ " + e.join(", ") + " }" }, classify: function() { return re.classify(this.getValues()) }, remove: function() { var e = !1; if (this._path) { var t = this._segment2 , n = t._handleOut; e = t.remove(), e && this._segment1._handleOut.set(n) } return e }, getPoint1: function() { return this._segment1._point }, setPoint1: function() { this._segment1._point.set(C.read(arguments)) }, getPoint2: function() { return this._segment2._point }, setPoint2: function() { this._segment2._point.set(C.read(arguments)) }, getHandle1: function() { return this._segment1._handleOut }, setHandle1: function() { this._segment1._handleOut.set(C.read(arguments)) }, getHandle2: function() { return this._segment2._handleIn }, setHandle2: function() { this._segment2._handleIn.set(C.read(arguments)) }, getSegment1: function() { return this._segment1 }, getSegment2: function() { return this._segment2 }, getPath: function() { return this._path }, getIndex: function() { return this._segment1._index }, getNext: function() { var e = this._path && this._path._curves; return e && (e[this._segment1._index + 1] || this._path._closed && e[0]) || null }, getPrevious: function() { var e = this._path && this._path._curves; return e && (e[this._segment1._index - 1] || this._path._closed && e[e.length - 1]) || null }, isFirst: function() { return !this._segment1._index }, isLast: function() { var e = this._path; return e && this._segment1._index === e._curves.length - 1 || !1 }, isSelected: function() { return this.getPoint1().isSelected() && this.getHandle1().isSelected() && this.getHandle2().isSelected() && this.getPoint2().isSelected() }, setSelected: function(e) { this.getPoint1().setSelected(e), this.getHandle1().setSelected(e), this.getHandle2().setSelected(e), this.getPoint2().setSelected(e) }, getValues: function(e) { return re.getValues(this._segment1, this._segment2, e) }, getPoints: function() { for (var e = this.getValues(), t = [], n = 0; n < 8; n += 2) t.push(new C(e[n],e[n + 1])); return t } }, { getLength: function() { return this._length == null && (this._length = re.getLength(this.getValues(), 0, 1)), this._length }, getArea: function() { return re.getArea(this.getValues()) }, getLine: function() { return new Se(this._segment1._point,this._segment2._point) }, getPart: function(e, t) { return new re(re.getPart(this.getValues(), e, t)) }, getPartLength: function(e, t) { return re.getLength(this.getValues(), e, t) }, divideAt: function(e) { return this.divideAtTime(e && e.curve === this ? e.time : this.getTimeAt(e)) }, divideAtTime: function(e, t) { var n = 1e-8 , i = 1 - n , r = null; if (e >= n && e <= i) { var s = re.subdivide(this.getValues(), e) , u = s[0] , o = s[1] , l = t || this.hasHandles() , f = this._segment1 , g = this._segment2 , y = this._path; l && (f._handleOut._set(u[2] - u[0], u[3] - u[1]), g._handleIn._set(o[4] - o[6], o[5] - o[7])); var _ = u[6] , v = u[7] , b = new pe(new C(_,v),l && new C(u[4] - _,u[5] - v),l && new C(o[2] - _,o[3] - v)); y ? (y.insert(f._index + 1, b), r = this.getNext()) : (this._segment2 = b, this._changed(), r = new re(b,g)) } return r }, splitAt: function(e) { var t = this._path; return t ? t.splitAt(e) : null }, splitAtTime: function(e) { return this.splitAt(this.getLocationAtTime(e)) }, divide: function(e, t) { return this.divideAtTime(e === a ? .5 : t ? e : this.getTimeAt(e)) }, split: function(e, t) { return this.splitAtTime(e === a ? .5 : t ? e : this.getTimeAt(e)) }, reversed: function() { return new re(this._segment2.reversed(),this._segment1.reversed()) }, clearHandles: function() { this._segment1._handleOut._set(0, 0), this._segment2._handleIn._set(0, 0) }, statics: { getValues: function(e, t, n, i) { var r = e._point , s = e._handleOut , u = t._handleIn , o = t._point , l = r.x , f = r.y , g = o.x , y = o.y , _ = i ? [l, f, l, f, g, y, g, y] : [l, f, l + s._x, f + s._y, g + u._x, y + u._y, g, y]; return n && n._transformCoordinates(_, _, 4), _ }, subdivide: function(e, t) { var n = e[0] , i = e[1] , r = e[2] , s = e[3] , u = e[4] , o = e[5] , l = e[6] , f = e[7]; t === a && (t = .5); var g = 1 - t , y = g * n + t * r , _ = g * i + t * s , v = g * r + t * u , b = g * s + t * o , T = g * u + t * l , x = g * o + t * f , S = g * y + t * v , I = g * _ + t * b , m = g * v + t * T , w = g * b + t * x , E = g * S + t * m , A = g * I + t * w; return [[n, i, y, _, S, I, E, A], [E, A, m, w, T, x, l, f]] }, getMonoCurves: function(e, t) { var n = [] , i = t ? 0 : 1 , r = e[i + 0] , s = e[i + 2] , u = e[i + 4] , o = e[i + 6]; if (r >= s == s >= u && s >= u == u >= o || re.isStraight(e)) n.push(e); else { var l = 3 * (s - u) - r + o , f = 2 * (r + u) - 4 * s , g = s - r , y = 1e-8 , _ = 1 - y , v = [] , b = O.solveQuadratic(l, f, g, v, y, _); if (!b) n.push(e); else { v.sort(); var T = v[0] , x = re.subdivide(e, T); n.push(x[0]), b > 1 && (T = (v[1] - T) / (1 - T), x = re.subdivide(x[1], T), n.push(x[0])), n.push(x[1]) } } return n }, solveCubic: function(e, t, n, i, r, s) { var u = e[t] , o = e[t + 2] , l = e[t + 4] , f = e[t + 6] , g = 0; if (!(u < n && f < n && o < n && l < n || u > n && f > n && o > n && l > n)) { var y = 3 * (o - u) , _ = 3 * (l - o) - y , v = f - u - y - _; g = O.solveCubic(v, _, y, u - n, i, r, s) } return g }, getTimeOf: function(e, t) { var n = new C(e[0],e[1]) , i = new C(e[6],e[7]) , r = 1e-12 , s = 1e-7 , u = t.isClose(n, r) ? 0 : t.isClose(i, r) ? 1 : null; if (u === null) for (var o = [t.x, t.y], l = [], f = 0; f < 2; f++) for (var g = re.solveCubic(e, f, o[f], l, 0, 1), y = 0; y < g; y++) { var _ = l[y]; if (t.isClose(re.getPoint(e, _), s)) return _ } return t.isClose(n, s) ? 0 : t.isClose(i, s) ? 1 : null }, getNearestTime: function(e, t) { if (re.isStraight(e)) { var n = e[0] , i = e[1] , r = e[6] , s = e[7] , u = r - n , o = s - i , l = u * u + o * o; if (l === 0) return 0; var f = ((t.x - n) * u + (t.y - i) * o) / l; return f < 1e-12 ? 0 : f > .999999999999 ? 1 : re.getTimeOf(e, new C(n + f * u,i + f * o)) } var g = 100 , y = 1 / 0 , _ = 0; function v(x) { if (x >= 0 && x <= 1) { var S = t.getDistance(re.getPoint(e, x), !0); if (S < y) return y = S, _ = x, !0 } } for (var b = 0; b <= g; b++) v(b / g); for (var T = 1 / (g * 2); T > 1e-8; ) !v(_ - T) && !v(_ + T) && (T /= 2); return _ }, getPart: function(e, t, n) { var i = t > n; if (i) { var r = t; t = n, n = r } return t > 0 && (e = re.subdivide(e, t)[1]), n < 1 && (e = re.subdivide(e, (n - t) / (1 - t))[0]), i ? [e[6], e[7], e[4], e[5], e[2], e[3], e[0], e[1]] : e }, isFlatEnough: function(e, t) { var n = e[0] , i = e[1] , r = e[2] , s = e[3] , u = e[4] , o = e[5] , l = e[6] , f = e[7] , g = 3 * r - 2 * n - l , y = 3 * s - 2 * i - f , _ = 3 * u - 2 * l - n , v = 3 * o - 2 * f - i; return Math.max(g * g, _ * _) + Math.max(y * y, v * v) <= 16 * t * t }, getArea: function(e) { var t = e[0] , n = e[1] , i = e[2] , r = e[3] , s = e[4] , u = e[5] , o = e[6] , l = e[7]; return 3 * ((l - n) * (i + s) - (o - t) * (r + u) + r * (t - s) - i * (n - u) + l * (s + t / 3) - o * (u + n / 3)) / 20 }, getBounds: function(e) { for (var t = e.slice(0, 2), n = t.slice(), i = [0, 0], r = 0; r < 2; r++) re._addBounds(e[r], e[r + 2], e[r + 4], e[r + 6], r, 0, t, n, i); return new Y(t[0],t[1],n[0] - t[0],n[1] - t[1]) }, _addBounds: function(e, t, n, i, r, s, u, o, l) { function f(E, A) { var N = E - A , L = E + A; N < u[r] && (u[r] = N), L > o[r] && (o[r] = L) } s /= 2; var g = u[r] + s , y = o[r] - s; if (e < g || t < g || n < g || i < g || e > y || t > y || n > y || i > y) if (t < e != t < i && n < e != n < i) f(e, 0), f(i, 0); else { var _ = 3 * (t - n) - e + i , v = 2 * (e + n) - 4 * t , b = t - e , T = O.solveQuadratic(_, v, b, l) , x = 1e-8 , S = 1 - x; f(i, 0); for (var I = 0; I < T; I++) { var m = l[I] , w = 1 - m; x <= m && m <= S && f(w * w * w * e + 3 * w * w * m * t + 3 * w * m * m * n + m * m * m * i, s) } } } } }, d.each(["getBounds", "getStrokeBounds", "getHandleBounds"], function(e) { this[e] = function() { this._bounds || (this._bounds = {}); var t = this._bounds[e]; return t || (t = this._bounds[e] = ke[e]([this._segment1, this._segment2], !1, this._path)), t.clone() } }, {}), d.each({ isStraight: function(e, t, n, i) { if (t.isZero() && n.isZero()) return !0; var r = i.subtract(e); if (r.isZero()) return !1; if (r.isCollinear(t) && r.isCollinear(n)) { var s = new Se(e,i) , u = 1e-7; if (s.getDistance(e.add(t)) < u && s.getDistance(i.add(n)) < u) { var o = r.dot(r) , l = r.dot(t) / o , f = r.dot(n) / o; return l >= 0 && l <= 1 && f <= 0 && f >= -1 } } return !1 }, isLinear: function(e, t, n, i) { var r = i.subtract(e).divide(3); return t.equals(r) && n.negate().equals(r) } }, function(e, t) { this[t] = function(n) { var i = this._segment1 , r = this._segment2; return e(i._point, i._handleOut, r._handleIn, r._point, n) } , this.statics[t] = function(n, i) { var r = n[0] , s = n[1] , u = n[6] , o = n[7]; return e(new C(r,s), new C(n[2] - r,n[3] - s), new C(n[4] - u,n[5] - o), new C(u,o), i) } }, { statics: {}, hasHandles: function() { return !this._segment1._handleOut.isZero() || !this._segment2._handleIn.isZero() }, hasLength: function(e) { return (!this.getPoint1().equals(this.getPoint2()) || this.hasHandles()) && this.getLength() > (e || 0) }, isCollinear: function(e) { return e && this.isStraight() && e.isStraight() && this.getLine().isCollinear(e.getLine()) }, isHorizontal: function() { return this.isStraight() && Math.abs(this.getTangentAtTime(.5).y) < 1e-8 }, isVertical: function() { return this.isStraight() && Math.abs(this.getTangentAtTime(.5).x) < 1e-8 } }), { beans: !1, getLocationAt: function(e, t) { return this.getLocationAtTime(t ? e : this.getTimeAt(e)) }, getLocationAtTime: function(e) { return e != null && e >= 0 && e <= 1 ? new Ot(this,e) : null }, getTimeAt: function(e, t) { return re.getTimeAt(this.getValues(), e, t) }, getParameterAt: "#getTimeAt", getTimesWithTangent: function() { var e = C.read(arguments); return e.isZero() ? [] : re.getTimesWithTangent(this.getValues(), e) }, getOffsetAtTime: function(e) { return this.getPartLength(0, e) }, getLocationOf: function() { return this.getLocationAtTime(this.getTimeOf(C.read(arguments))) }, getOffsetOf: function() { var e = this.getLocationOf.apply(this, arguments); return e ? e.getOffset() : null }, getTimeOf: function() { return re.getTimeOf(this.getValues(), C.read(arguments)) }, getParameterOf: "#getTimeOf", getNearestLocation: function() { var e = C.read(arguments) , t = this.getValues() , n = re.getNearestTime(t, e) , i = re.getPoint(t, n); return new Ot(this,n,i,null,e.getDistance(i)) }, getNearestPoint: function() { var e = this.getNearestLocation.apply(this, arguments); return e && e.getPoint() } }, new function() { var e = ["getPoint", "getTangent", "getNormal", "getWeightedTangent", "getWeightedNormal", "getCurvature"]; return d.each(e, function(t) { this[t + "At"] = function(n, i) { var r = this.getValues(); return re[t](r, i ? n : re.getTimeAt(r, n)) } , this[t + "AtTime"] = function(n) { return re[t](this.getValues(), n) } }, { statics: { _evaluateMethods: e } }) } , new function() { function e(i) { var r = i[0] , s = i[1] , u = i[2] , o = i[3] , l = i[4] , f = i[5] , g = i[6] , y = i[7] , _ = 9 * (u - l) + 3 * (g - r) , v = 6 * (r + l) - 12 * u , b = 3 * (u - r) , T = 9 * (o - f) + 3 * (y - s) , x = 6 * (s + f) - 12 * o , S = 3 * (o - s); return function(I) { var m = (_ * I + v) * I + b , w = (T * I + x) * I + S; return Math.sqrt(m * m + w * w) } } function t(i, r) { return Math.max(2, Math.min(16, Math.ceil(Math.abs(r - i) * 32))) } function n(i, r, s, u) { if (r == null || r < 0 || r > 1) return null; var o = i[0] , l = i[1] , f = i[2] , g = i[3] , y = i[4] , _ = i[5] , v = i[6] , b = i[7] , T = O.isZero; T(f - o) && T(g - l) && (f = o, g = l), T(y - v) && T(_ - b) && (y = v, _ = b); var x = 3 * (f - o), S = 3 * (y - f) - x, I = v - o - x - S, m = 3 * (g - l), w = 3 * (_ - g) - m, E = b - l - m - w, A, N; if (s === 0) A = r === 0 ? o : r === 1 ? v : ((I * r + S) * r + x) * r + o, N = r === 0 ? l : r === 1 ? b : ((E * r + w) * r + m) * r + l; else { var L = 1e-8 , R = 1 - L; if (r < L ? (A = x, N = m) : r > R ? (A = 3 * (v - y), N = 3 * (b - _)) : (A = (3 * I * r + 2 * S) * r + x, N = (3 * E * r + 2 * w) * r + m), u) { A === 0 && N === 0 && (r < L || r > R) && (A = y - f, N = _ - g); var D = Math.sqrt(A * A + N * N); D && (A /= D, N /= D) } if (s === 3) { var y = 6 * I * r + 2 * S , _ = 6 * E * r + 2 * w , V = Math.pow(A * A + N * N, 3 / 2); A = V !== 0 ? (A * _ - N * y) / V : 0, N = 0 } } return s === 2 ? new C(N,-A) : new C(A,N) } return { statics: { classify: function(i) { var r = i[0] , s = i[1] , u = i[2] , o = i[3] , l = i[4] , f = i[5] , g = i[6] , y = i[7] , _ = r * (y - f) + s * (l - g) + g * f - y * l , v = u * (s - y) + o * (g - r) + r * y - s * g , b = l * (o - s) + f * (r - u) + u * s - o * r , T = 3 * b , x = T - v , S = x - v + _ , I = Math.sqrt(S * S + x * x + T * T) , m = I !== 0 ? 1 / I : 0 , w = O.isZero , E = "serpentine"; S *= m, x *= m, T *= m; function A(D, V, z) { var G = V !== a , H = G && V > 0 && V < 1 , K = G && z > 0 && z < 1; return G && (!(H || K) || D === "loop" && !(H && K)) && (D = "arch", H = K = !1), { type: D, roots: H || K ? H && K ? V < z ? [V, z] : [z, V] : [H ? V : z] : null } } if (w(S)) return w(x) ? A(w(T) ? "line" : "quadratic") : A(E, T / (3 * x)); var N = 3 * x * x - 4 * S * T; if (w(N)) return A("cusp", x / (2 * S)); var L = N > 0 ? Math.sqrt(N / 3) : Math.sqrt(-N) , R = 2 * S; return A(N > 0 ? E : "loop", (x + L) / R, (x - L) / R) }, getLength: function(i, r, s, u) { if (r === a && (r = 0), s === a && (s = 1), re.isStraight(i)) { var o = i; s < 1 && (o = re.subdivide(o, s)[0], r /= s), r > 0 && (o = re.subdivide(o, r)[1]); var l = o[6] - o[0] , f = o[7] - o[1]; return Math.sqrt(l * l + f * f) } return O.integrate(u || e(i), r, s, t(r, s)) }, getTimeAt: function(i, r, s) { if (s === a && (s = r < 0 ? 1 : 0), r === 0) return s; var u = Math.abs , o = 1e-12 , l = r > 0 , f = l ? s : 0 , g = l ? 1 : s , y = e(i) , _ = re.getLength(i, f, g, y) , v = u(r) - _; if (u(v) < o) return l ? g : f; if (v > o) return null; var b = r / _ , T = 0; function x(S) { return T += O.integrate(y, s, S, t(s, S)), s = S, T - r } return O.findRoot(x, y, s + b, f, g, 32, 1e-12) }, getPoint: function(i, r) { return n(i, r, 0, !1) }, getTangent: function(i, r) { return n(i, r, 1, !0) }, getWeightedTangent: function(i, r) { return n(i, r, 1, !1) }, getNormal: function(i, r) { return n(i, r, 2, !0) }, getWeightedNormal: function(i, r) { return n(i, r, 2, !1) }, getCurvature: function(i, r) { return n(i, r, 3, !1).x }, getPeaks: function(i) { var r = i[0] , s = i[1] , u = i[2] , o = i[3] , l = i[4] , f = i[5] , g = i[6] , y = i[7] , _ = -r + 3 * u - 3 * l + g , v = 3 * r - 6 * u + 3 * l , b = -3 * r + 3 * u , T = -s + 3 * o - 3 * f + y , x = 3 * s - 6 * o + 3 * f , S = -3 * s + 3 * o , I = 1e-8 , m = 1 - I , w = []; return O.solveCubic(9 * (_ * _ + T * T), 9 * (_ * v + x * T), 2 * (v * v + x * x) + 3 * (b * _ + S * T), b * v + x * S, w, I, m), w.sort() } } } } , new function() { function e(v, b, T, x, S, I, m) { var w = !m && T.getPrevious() === S , E = !m && T !== S && T.getNext() === S , A = 1e-8 , N = 1 - A; if (x !== null && x >= (w ? A : 0) && x <= (E ? N : 1) && I !== null && I >= (E ? A : 0) && I <= (w ? N : 1)) { var L = new Ot(T,x,null,m) , R = new Ot(S,I,null,m); L._intersection = R, R._intersection = L, (!b || b(L)) && Ot.insert(v, L, !0) } } function t(v, b, T, x, S, I, m, w, E, A, N, L, R) { if (++E >= 4096 || ++w >= 40) return E; var D = 1e-9, V = b[0], z = b[1], G = b[6], H = b[7], K = Se.getSignedDistance, $ = K(V, z, G, H, b[2], b[3]), W = K(V, z, G, H, b[4], b[5]), te = $ * W > 0 ? 3 / 4 : 4 / 9, se = te * Math.min(0, $, W), ue = te * Math.max(0, $, W), Ie = K(V, z, G, H, v[0], v[1]), Ee = K(V, z, G, H, v[2], v[3]), de = K(V, z, G, H, v[4], v[5]), ve = K(V, z, G, H, v[6], v[7]), Oe = n(Ie, Ee, de, ve), Te = Oe[0], Ge = Oe[1], Re, xe; if ($ === 0 && W === 0 && Ie === 0 && Ee === 0 && de === 0 && ve === 0 || (Re = i(Te, Ge, se, ue)) == null || (xe = i(Te.reverse(), Ge.reverse(), se, ue)) == null) return E; var ze = A + (N - A) * Re , De = A + (N - A) * xe; if (Math.max(R - L, De - ze) < D) { var _t = (ze + De) / 2 , gt = (L + R) / 2; e(S, I, m ? x : T, m ? gt : _t, m ? T : x, m ? _t : gt) } else { v = re.getPart(v, Re, xe); var Et = R - L; if (xe - Re > .8) if (De - ze > Et) { var nt = re.subdivide(v, .5) , _t = (ze + De) / 2; E = t(b, nt[0], x, T, S, I, !m, w, E, L, R, ze, _t), E = t(b, nt[1], x, T, S, I, !m, w, E, L, R, _t, De) } else { var nt = re.subdivide(b, .5) , gt = (L + R) / 2; E = t(nt[0], v, x, T, S, I, !m, w, E, L, gt, ze, De), E = t(nt[1], v, x, T, S, I, !m, w, E, gt, R, ze, De) } else Et === 0 || Et >= D ? E = t(b, v, x, T, S, I, !m, w, E, L, R, ze, De) : E = t(v, b, T, x, S, I, m, w, E, ze, De, L, R) } return E } function n(v, b, T, x) { var S = [0, v], I = [1 / 3, b], m = [2 / 3, T], w = [1, x], E = b - (2 * v + x) / 3, A = T - (v + 2 * x) / 3, N; if (E * A < 0) N = [[S, I, w], [S, m, w]]; else { var L = E / A; N = [L >= 2 ? [S, I, w] : L <= .5 ? [S, m, w] : [S, I, m, w], [S, w]] } return (E || A) < 0 ? N.reverse() : N } function i(v, b, T, x) { return v[0][1] < T ? r(v, !0, T) : b[0][1] > x ? r(b, !1, x) : v[0][0] } function r(v, b, T) { for (var x = v[0][0], S = v[0][1], I = 1, m = v.length; I < m; I++) { var w = v[I][0] , E = v[I][1]; if (b ? E >= T : E <= T) return E === T ? w : x + (T - S) * (w - x) / (E - S); x = w, S = E } return null } function s(v, b, T, x, S) { var I = O.isZero; if (I(x) && I(S)) { var m = re.getTimeOf(v, new C(b,T)); return m === null ? [] : [m] } for (var w = Math.atan2(-S, x), E = Math.sin(w), A = Math.cos(w), N = [], L = [], R = 0; R < 8; R += 2) { var D = v[R] - b , V = v[R + 1] - T; N.push(D * A - V * E, D * E + V * A) } return re.solveCubic(N, 1, 0, L, 0, 1), L } function u(v, b, T, x, S, I, m) { for (var w = b[0], E = b[1], A = b[6], N = b[7], L = s(v, w, E, A - w, N - E), R = 0, D = L.length; R < D; R++) { var V = L[R] , z = re.getPoint(v, V) , G = re.getTimeOf(b, z); G !== null && e(S, I, m ? x : T, m ? G : V, m ? T : x, m ? V : G) } } function o(v, b, T, x, S, I) { var m = Se.intersect(v[0], v[1], v[6], v[7], b[0], b[1], b[6], b[7]); m && e(S, I, T, re.getTimeOf(v, m), x, re.getTimeOf(b, m)) } function l(v, b, T, x, S, I) { var m = 1e-12 , w = Math.min , E = Math.max; if (E(v[0], v[2], v[4], v[6]) + m > w(b[0], b[2], b[4], b[6]) && w(v[0], v[2], v[4], v[6]) - m < E(b[0], b[2], b[4], b[6]) && E(v[1], v[3], v[5], v[7]) + m > w(b[1], b[3], b[5], b[7]) && w(v[1], v[3], v[5], v[7]) - m < E(b[1], b[3], b[5], b[7])) { var A = y(v, b); if (A) for (var N = 0; N < 2; N++) { var L = A[N]; e(S, I, T, L[0], x, L[1], !0) } else { var R = re.isStraight(v) , D = re.isStraight(b) , V = R && D , z = R && !D , G = S.length; if ((V ? o : R || D ? u : t)(z ? b : v, z ? v : b, z ? x : T, z ? T : x, S, I, z, 0, 0, 0, 1, 0, 1), !V || S.length === G) for (var N = 0; N < 4; N++) { var H = N >> 1 , K = N & 1 , $ = H * 6 , W = K * 6 , te = new C(v[$],v[$ + 1]) , se = new C(b[W],b[W + 1]); te.isClose(se, m) && e(S, I, T, H, x, K) } } } return S } function f(v, b, T, x) { var S = re.classify(v); if (S.type === "loop") { var I = S.roots; e(T, x, b, I[0], b, I[1]) } return T } function g(v, b, T, x, S, I) { var m = 1e-7 , w = !b; w && (b = v); for (var E = v.length, A = b.length, N = new Array(E), L = w ? N : new Array(A), R = [], D = 0; D < E; D++) N[D] = v[D].getValues(x); if (!w) for (var D = 0; D < A; D++) L[D] = b[D].getValues(S); for (var V = q.findCurveBoundsCollisions(N, L, m), z = 0; z < E; z++) { var G = v[z] , H = N[z]; w && f(H, G, R, T); var K = V[z]; if (K) for (var $ = 0; $ < K.length; $++) { if (I && R.length) return R; var W = K[$]; if (!w || W > z) { var te = b[W] , se = L[W]; l(H, se, G, te, R, T) } } } return R } function y(v, b) { function T(ve) { var Oe = ve[6] - ve[0] , Te = ve[7] - ve[1]; return Oe * Oe + Te * Te } var x = Math.abs , S = Se.getDistance , I = 1e-8 , m = 1e-7 , w = re.isStraight(v) , E = re.isStraight(b) , A = w && E , N = T(v) < T(b) , L = N ? b : v , R = N ? v : b , D = L[0] , V = L[1] , z = L[6] - D , G = L[7] - V; if (S(D, V, z, G, R[0], R[1], !0) < m && S(D, V, z, G, R[6], R[7], !0) < m) !A && S(D, V, z, G, L[2], L[3], !0) < m && S(D, V, z, G, L[4], L[5], !0) < m && S(D, V, z, G, R[2], R[3], !0) < m && S(D, V, z, G, R[4], R[5], !0) < m && (w = E = A = !0); else if (A) return null; if (w ^ E) return null; for (var H = [v, b], K = [], $ = 0; $ < 4 && K.length < 2; $++) { var W = $ & 1 , te = W ^ 1 , se = $ >> 1 , ue = re.getTimeOf(H[W], new C(H[te][se ? 6 : 0],H[te][se ? 7 : 1])); if (ue != null) { var Ie = W ? [se, ue] : [ue, se]; (!K.length || x(Ie[0] - K[0][0]) > I && x(Ie[1] - K[0][1]) > I) && K.push(Ie) } if ($ > 2 && !K.length) break } if (K.length !== 2) K = null; else if (!A) { var Ee = re.getPart(v, K[0][0], K[1][0]) , de = re.getPart(b, K[0][1], K[1][1]); (x(de[2] - Ee[2]) > m || x(de[3] - Ee[3]) > m || x(de[4] - Ee[4]) > m || x(de[5] - Ee[5]) > m) && (K = null) } return K } function _(v, b) { var T = v[0] , x = v[1] , S = v[2] , I = v[3] , m = v[4] , w = v[5] , E = v[6] , A = v[7] , N = b.normalize() , L = N.x , R = N.y , D = 3 * E - 9 * m + 9 * S - 3 * T , V = 3 * A - 9 * w + 9 * I - 3 * x , z = 6 * m - 12 * S + 6 * T , G = 6 * w - 12 * I + 6 * x , H = 3 * S - 3 * T , K = 3 * I - 3 * x , $ = 2 * D * R - 2 * V * L , W = []; if (Math.abs($) < O.CURVETIME_EPSILON) { var te = D * K - V * H , $ = D * G - V * z; if ($ != 0) { var se = -te / $; se >= 0 && se <= 1 && W.push(se) } } else { var ue = (z * z - 4 * D * H) * R * R + (-2 * z * G + 4 * V * H + 4 * D * K) * L * R + (G * G - 4 * V * K) * L * L , Ie = z * R - G * L; if (ue >= 0 && $ != 0) { var Ee = Math.sqrt(ue) , de = -(Ie + Ee) / $ , ve = (-Ie + Ee) / $; de >= 0 && de <= 1 && W.push(de), ve >= 0 && ve <= 1 && W.push(ve) } } return W } return { getIntersections: function(v) { var b = this.getValues() , T = v && v !== this && v.getValues(); return T ? l(b, T, this, v, []) : f(b, this, []) }, statics: { getOverlaps: y, getIntersections: g, getCurveLineIntersections: s, getTimesWithTangent: _ } } } ) , Ot = d.extend({ _class: "CurveLocation", initialize: function(t, n, i, r, s) { if (n >= .99999999) { var u = t.getNext(); u && (n = 0, t = u) } this._setCurve(t), this._time = n, this._point = i || t.getPointAtTime(n), this._overlap = r, this._distance = s, this._intersection = this._next = this._previous = null }, _setPath: function(e) { this._path = e, this._version = e ? e._version : 0 }, _setCurve: function(e) { this._setPath(e._path), this._curve = e, this._segment = null, this._segment1 = e._segment1, this._segment2 = e._segment2 }, _setSegment: function(e) { var t = e.getCurve(); t ? this._setCurve(t) : (this._setPath(e._path), this._segment1 = e, this._segment2 = null), this._segment = e, this._time = e === this._segment1 ? 0 : 1, this._point = e._point.clone() }, getSegment: function() { var e = this._segment; if (!e) { var t = this.getCurve() , n = this.getTime(); n === 0 ? e = t._segment1 : n === 1 ? e = t._segment2 : n != null && (e = t.getPartLength(0, n) < t.getPartLength(n, 1) ? t._segment1 : t._segment2), this._segment = e } return e }, getCurve: function() { var e = this._path , t = this; e && e._version !== this._version && (this._time = this._offset = this._curveOffset = this._curve = null); function n(i) { var r = i && i.getCurve(); if (r && (t._time = r.getTimeOf(t._point)) != null) return t._setCurve(r), r } return this._curve || n(this._segment) || n(this._segment1) || n(this._segment2.getPrevious()) }, getPath: function() { var e = this.getCurve(); return e && e._path }, getIndex: function() { var e = this.getCurve(); return e && e.getIndex() }, getTime: function() { var e = this.getCurve() , t = this._time; return e && t == null ? this._time = e.getTimeOf(this._point) : t }, getParameter: "#getTime", getPoint: function() { return this._point }, getOffset: function() { var e = this._offset; if (e == null) { e = 0; var t = this.getPath() , n = this.getIndex(); if (t && n != null) for (var i = t.getCurves(), r = 0; r < n; r++) e += i[r].getLength(); this._offset = e += this.getCurveOffset() } return e }, getCurveOffset: function() { var e = this._curveOffset; if (e == null) { var t = this.getCurve() , n = this.getTime(); this._curveOffset = e = n != null && t && t.getPartLength(0, n) } return e }, getIntersection: function() { return this._intersection }, getDistance: function() { return this._distance }, divide: function() { var e = this.getCurve() , t = e && e.divideAtTime(this.getTime()); return t && this._setSegment(t._segment1), t }, split: function() { var e = this.getCurve() , t = e._path , n = e && e.splitAtTime(this.getTime()); return n && this._setSegment(t.getLastSegment()), n }, equals: function(e, t) { var n = this === e; if (!n && e instanceof Ot) { var i = this.getCurve() , r = e.getCurve() , s = i._path , u = r._path; if (s === u) { var o = Math.abs , l = 1e-7 , f = o(this.getOffset() - e.getOffset()) , g = !t && this._intersection , y = !t && e._intersection; n = (f < l || s && o(s.getLength() - f) < l) && (!g && !y || g && y && g.equals(y, !0)) } } return n }, toString: function() { var e = [] , t = this.getPoint() , n = k.instance; t && e.push("point: " + t); var i = this.getIndex(); i != null && e.push("index: " + i); var r = this.getTime(); return r != null && e.push("time: " + n.number(r)), this._distance != null && e.push("distance: " + n.number(this._distance)), "{ " + e.join(", ") + " }" }, isTouching: function() { var e = this._intersection; if (e && this.getTangent().isCollinear(e.getTangent())) { var t = this.getCurve() , n = e.getCurve(); return !(t.isStraight() && n.isStraight() && t.getLine().intersect(n.getLine())) } return !1 }, isCrossing: function() { var e = this._intersection; if (!e) return !1; var t = this.getTime() , n = e.getTime() , i = 1e-8 , r = 1 - i , s = t >= i && t <= r , u = n >= i && n <= r; if (s && u) return !this.isTouching(); var o = this.getCurve() , l = o && t < i ? o.getPrevious() : o , f = e.getCurve() , g = f && n < i ? f.getPrevious() : f; if (t > r && (o = o.getNext()), n > r && (f = f.getNext()), !l || !o || !g || !f) return !1; var y = []; function _(L, R) { var D = L.getValues() , V = re.classify(D).roots || re.getPeaks(D) , z = V.length , G = re.getLength(D, R && z ? V[z - 1] : 0, !R && z ? V[0] : 1); y.push(z ? G : G / 32) } function v(L, R, D) { return R < D ? L > R && L < D : L > R || L < D } s || (_(l, !0), _(o, !1)), u || (_(g, !0), _(f, !1)); var b = this.getPoint() , T = Math.min.apply(Math, y) , x = s ? o.getTangentAtTime(t) : o.getPointAt(T).subtract(b) , S = s ? x.negate() : l.getPointAt(-T).subtract(b) , I = u ? f.getTangentAtTime(n) : f.getPointAt(T).subtract(b) , m = u ? I.negate() : g.getPointAt(-T).subtract(b) , w = S.getAngle() , E = x.getAngle() , A = m.getAngle() , N = I.getAngle(); return !!(s ? v(w, A, N) ^ v(E, A, N) && v(w, N, A) ^ v(E, N, A) : v(A, w, E) ^ v(N, w, E) && v(A, E, w) ^ v(N, E, w)) }, hasOverlap: function() { return !!this._overlap } }, d.each(re._evaluateMethods, function(e) { var t = e + "At"; this[e] = function() { var n = this.getCurve() , i = this.getTime(); return i != null && n && n[t](i, !0) } }, { preserve: !0 }), new function() { function e(t, n, i) { var r = t.length , s = 0 , u = r - 1; function o(b, T) { for (var x = b + T; x >= -1 && x <= r; x += T) { var S = t[(x % r + r) % r]; if (!n.getPoint().isClose(S.getPoint(), 1e-7)) break; if (n.equals(S)) return S } return null } for (; s <= u; ) { var l = s + u >>> 1, f = t[l], g; if (i && (g = n.equals(f) ? f : o(l, -1) || o(l, 1))) return n._overlap && (g._overlap = g._intersection._overlap = !0), g; var y = n.getPath() , _ = f.getPath() , v = y !== _ ? y._id - _._id : n.getIndex() + n.getTime() - (f.getIndex() + f.getTime()); v < 0 ? u = l - 1 : s = l + 1 } return t.splice(s, 0, n), n } return { statics: { insert: e, expand: function(t) { for (var n = t.slice(), i = t.length - 1; i >= 0; i--) e(n, t[i]._intersection, !1); return n } } } } ) , Ft = oe.extend({ _class: "PathItem", _selectBounds: !1, _canScaleStroke: !0, beans: !0, initialize: function() {}, statics: { create: function(e) { var t, n, i; if (d.isPlainObject(e) ? (n = e.segments, t = e.pathData) : Array.isArray(e) ? n = e : typeof e == "string" && (t = e), n) { var r = n[0]; i = r && Array.isArray(r[0]) } else t && (i = (t.match(/m/gi) || []).length > 1 || /z\s*\S+/i.test(t)); var s = i ? ot : ke; return new s(e) } }, _asPathItem: function() { return this }, isClockwise: function() { return this.getArea() >= 0 }, setClockwise: function(e) { this.isClockwise() != (e = !!e) && this.reverse() }, setPathData: function(e) { var t = e && e.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig), n, i = !1, r, s, u = new C, o = new C; function l(m, w) { var E = +n[m]; return i && (E += u[w]), E } function f(m) { return new C(l(m, "x"),l(m + 1, "y")) } this.clear(); for (var g = 0, y = t && t.length; g < y; g++) { var _ = t[g] , v = _[0] , b = v.toLowerCase(); n = _.match(/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g); var T = n && n.length; switch (i = v === b, r === "z" && !/[mz]/.test(b) && this.moveTo(u), b) { case "m": case "l": for (var x = b === "m", S = 0; S < T; S += 2) this[x ? "moveTo" : "lineTo"](u = f(S)), x && (o = u, x = !1); s = u; break; case "h": case "v": var I = b === "h" ? "x" : "y"; u = u.clone(); for (var S = 0; S < T; S++) u[I] = l(S, I), this.lineTo(u); s = u; break; case "c": for (var S = 0; S < T; S += 6) this.cubicCurveTo(f(S), s = f(S + 2), u = f(S + 4)); break; case "s": for (var S = 0; S < T; S += 4) this.cubicCurveTo(/[cs]/.test(r) ? u.multiply(2).subtract(s) : u, s = f(S), u = f(S + 2)), r = b; break; case "q": for (var S = 0; S < T; S += 4) this.quadraticCurveTo(s = f(S), u = f(S + 2)); break; case "t": for (var S = 0; S < T; S += 2) this.quadraticCurveTo(s = /[qt]/.test(r) ? u.multiply(2).subtract(s) : u, u = f(S)), r = b; break; case "a": for (var S = 0; S < T; S += 7) this.arcTo(u = f(S + 5), new J(+n[S],+n[S + 1]), +n[S + 2], +n[S + 4], +n[S + 3]); break; case "z": this.closePath(1e-12), u = o; break } r = b } }, _canComposite: function() { return !(this.hasFill() && this.hasStroke()) }, _contains: function(e) { var t = e.isInside(this.getBounds({ internal: !0, handle: !0 })) ? this._getWinding(e) : {}; return t.onPath || !!(this.getFillRule() === "evenodd" ? t.windingL & 1 || t.windingR & 1 : t.winding) }, getIntersections: function(e, t, n, i) { var r = this === e || !e , s = this._matrix._orNullIfIdentity() , u = r ? s : (n || e._matrix)._orNullIfIdentity(); return r || this.getBounds(s).intersects(e.getBounds(u), 1e-12) ? re.getIntersections(this.getCurves(), !r && e.getCurves(), t, s, u, i) : [] }, getCrossings: function(e) { return this.getIntersections(e, function(t) { return t.isCrossing() }) }, getNearestLocation: function() { for (var e = C.read(arguments), t = this.getCurves(), n = 1 / 0, i = null, r = 0, s = t.length; r < s; r++) { var u = t[r].getNearestLocation(e); u._distance < n && (n = u._distance, i = u) } return i }, getNearestPoint: function() { var e = this.getNearestLocation.apply(this, arguments); return e && e.getPoint() }, interpolate: function(e, t, n) { var i = !this._children , r = i ? "_segments" : "_children" , s = e[r] , u = t[r] , o = this[r]; if (!s || !u || s.length !== u.length) throw new Error("Invalid operands in interpolate() call: " + e + ", " + t); var l = o.length , f = u.length; if (l < f) for (var g = i ? pe : ke, y = l; y < f; y++) this.add(new g); else l > f && this[i ? "removeSegments" : "removeChildren"](f, l); for (var y = 0; y < f; y++) o[y].interpolate(s[y], u[y], n); i && (this.setClosed(e._closed), this._changed(9)) }, compare: function(e) { var t = !1; if (e) { var n = this._children || [this] , i = e._children ? e._children.slice() : [e] , r = n.length , s = i.length , u = [] , o = 0; t = !0; for (var l = q.findItemBoundsCollisions(n, i, O.GEOMETRIC_EPSILON), f = r - 1; f >= 0 && t; f--) { var g = n[f]; t = !1; var y = l[f]; if (y) for (var _ = y.length - 1; _ >= 0 && !t; _--) g.compare(i[y[_]]) && (u[y[_]] || (u[y[_]] = !0, o++), t = !0) } t = t && o === s } return t } }) , ke = Ft.extend({ _class: "Path", _serializeFields: { segments: [], closed: !1 }, initialize: function(t) { this._closed = !1, this._segments = [], this._version = 0; var n = arguments , i = Array.isArray(t) ? typeof t[0] == "object" ? t : n : t && t.size === a && (t.x !== a || t.point !== a) ? n : null; i && i.length > 0 ? this.setSegments(i) : (this._curves = a, this._segmentSelection = 0, !i && typeof t == "string" && (this.setPathData(t), t = null)), this._initialize(!i && t) }, _equals: function(e) { return this._closed === e._closed && d.equals(this._segments, e._segments) }, copyContent: function(e) { this.setSegments(e._segments), this._closed = e._closed }, _changed: function e(t) { if (e.base.call(this, t), t & 8) { if (this._length = this._area = a, t & 32) this._version++; else if (this._curves) for (var n = 0, i = this._curves.length; n < i; n++) this._curves[n]._changed() } else t & 64 && (this._bounds = a) }, getStyle: function() { var e = this._parent; return (e instanceof ot ? e : this)._style }, getSegments: function() { return this._segments }, setSegments: function(e) { var t = this.isFullySelected() , n = e && e.length; if (this._segments.length = 0, this._segmentSelection = 0, this._curves = a, n) { var i = e[n - 1]; typeof i == "boolean" && (this.setClosed(i), n--), this._add(pe.readList(e, 0, {}, n)) } t && this.setFullySelected(!0) }, getFirstSegment: function() { return this._segments[0] }, getLastSegment: function() { return this._segments[this._segments.length - 1] }, getCurves: function() { var e = this._curves , t = this._segments; if (!e) { var n = this._countCurves(); e = this._curves = new Array(n); for (var i = 0; i < n; i++) e[i] = new re(this,t[i],t[i + 1] || t[0]) } return e }, getFirstCurve: function() { return this.getCurves()[0] }, getLastCurve: function() { var e = this.getCurves(); return e[e.length - 1] }, isClosed: function() { return this._closed }, setClosed: function(e) { if (this._closed != (e = !!e)) { if (this._closed = e, this._curves) { var t = this._curves.length = this._countCurves(); e && (this._curves[t - 1] = new re(this,this._segments[t - 1],this._segments[0])) } this._changed(41) } } }, { beans: !0, getPathData: function(e, t) { var n = this._segments, i = n.length, r = new k(t), s = new Array(6), u = !0, o, l, f, g, y, _, v, b, T = []; function x(I, m) { if (I._transformCoordinates(e, s), o = s[0], l = s[1], u) T.push("M" + r.pair(o, l)), u = !1; else if (y = s[2], _ = s[3], y === o && _ === l && v === f && b === g) { if (!m) { var w = o - f , E = l - g; T.push(w === 0 ? "v" + r.number(E) : E === 0 ? "h" + r.number(w) : "l" + r.pair(w, E)) } } else T.push("c" + r.pair(v - f, b - g) + " " + r.pair(y - f, _ - g) + " " + r.pair(o - f, l - g)); f = o, g = l, v = s[4], b = s[5] } if (!i) return ""; for (var S = 0; S < i; S++) x(n[S]); return this._closed && i > 0 && (x(n[0], !0), T.push("z")), T.join("") }, isEmpty: function() { return !this._segments.length }, _transformContent: function(e) { for (var t = this._segments, n = new Array(6), i = 0, r = t.length; i < r; i++) t[i]._transformCoordinates(e, n, !0); return !0 }, _add: function(e, u) { for (var n = this._segments, i = this._curves, r = e.length, s = u == null, u = s ? n.length : u, o = 0; o < r; o++) { var l = e[o]; l._path && (l = e[o] = l.clone()), l._path = this, l._index = u + o, l._selection && this._updateSelection(l, 0, l._selection) } if (s) d.push(n, e); else { n.splice.apply(n, [u, 0].concat(e)); for (var o = u + r, f = n.length; o < f; o++) n[o]._index = o } if (i) { var g = this._countCurves() , y = u > 0 && u + r - 1 === g ? u - 1 : u , _ = y , v = Math.min(y + r, g); e._curves && (i.splice.apply(i, [y, 0].concat(e._curves)), _ += e._curves.length); for (var o = _; o < v; o++) i.splice(o, 0, new re(this,null,null)); this._adjustCurves(y, v) } return this._changed(41), e }, _adjustCurves: function(e, t) { for (var n = this._segments, i = this._curves, r, s = e; s < t; s++) r = i[s], r._path = this, r._segment1 = n[s], r._segment2 = n[s + 1] || n[0], r._changed(); (r = i[this._closed && !e ? n.length - 1 : e - 1]) && (r._segment2 = n[e] || n[0], r._changed()), (r = i[t]) && (r._segment1 = n[t], r._changed()) }, _countCurves: function() { var e = this._segments.length; return !this._closed && e > 0 ? e - 1 : e }, add: function(e) { var t = arguments; return t.length > 1 && typeof e != "number" ? this._add(pe.readList(t)) : this._add([pe.read(t)])[0] }, insert: function(e, t) { var n = arguments; return n.length > 2 && typeof t != "number" ? this._add(pe.readList(n, 1), e) : this._add([pe.read(n, 1)], e)[0] }, addSegment: function() { return this._add([pe.read(arguments)])[0] }, insertSegment: function(e) { return this._add([pe.read(arguments, 1)], e)[0] }, addSegments: function(e) { return this._add(pe.readList(e)) }, insertSegments: function(e, t) { return this._add(pe.readList(t), e) }, removeSegment: function(e) { return this.removeSegments(e, e + 1)[0] || null }, removeSegments: function(e, t, n) { e = e || 0, t = d.pick(t, this._segments.length); var i = this._segments , r = this._curves , s = i.length , u = i.splice(e, t - e) , o = u.length; if (!o) return u; for (var l = 0; l < o; l++) { var f = u[l]; f._selection && this._updateSelection(f, f._selection, 0), f._index = f._path = null } for (var l = e, g = i.length; l < g; l++) i[l]._index = l; if (r) { for (var y = e > 0 && t === s + (this._closed ? 1 : 0) ? e - 1 : e, r = r.splice(y, o), l = r.length - 1; l >= 0; l--) r[l]._path = null; n && (u._curves = r.slice(1)), this._adjustCurves(y, y) } return this._changed(41), u }, clear: "#removeSegments", hasHandles: function() { for (var e = this._segments, t = 0, n = e.length; t < n; t++) if (e[t].hasHandles()) return !0; return !1 }, clearHandles: function() { for (var e = this._segments, t = 0, n = e.length; t < n; t++) e[t].clearHandles() }, getLength: function() { if (this._length == null) { for (var e = this.getCurves(), t = 0, n = 0, i = e.length; n < i; n++) t += e[n].getLength(); this._length = t } return this._length }, getArea: function() { var e = this._area; if (e == null) { var t = this._segments , n = this._closed; e = 0; for (var i = 0, r = t.length; i < r; i++) { var s = i + 1 === r; e += re.getArea(re.getValues(t[i], t[s ? 0 : i + 1], null, s && !n)) } this._area = e } return e }, isFullySelected: function() { var e = this._segments.length; return this.isSelected() && e > 0 && this._segmentSelection === e * 7 }, setFullySelected: function(e) { e && this._selectSegments(!0), this.setSelected(e) }, setSelection: function e(t) { t & 1 || this._selectSegments(!1), e.base.call(this, t) }, _selectSegments: function(e) { var t = this._segments , n = t.length , i = e ? 7 : 0; this._segmentSelection = i * n; for (var r = 0; r < n; r++) t[r]._selection = i }, _updateSelection: function(e, t, n) { e._selection = n; var i = this._segmentSelection += n - t; i > 0 && this.setSelected(!0) }, divideAt: function(e) { var t = this.getLocationAt(e), n; return t && (n = t.getCurve().divideAt(t.getCurveOffset())) ? n._segment1 : null }, splitAt: function(e) { var t = this.getLocationAt(e) , n = t && t.index , i = t && t.time , r = 1e-8 , s = 1 - r; i > s && (n++, i = 0); var u = this.getCurves(); if (n >= 0 && n < u.length) { i >= r && u[n++].divideAtTime(i); var o = this.removeSegments(n, this._segments.length, !0), l; return this._closed ? (this.setClosed(!1), l = this) : (l = new ke(oe.NO_INSERT), l.insertAbove(this), l.copyAttributes(this)), l._add(o, 0), this.addSegment(o[0]), l } return null }, split: function(e, t) { var n, i = t === a ? e : (n = this.getCurves()[e]) && n.getLocationAtTime(t); return i != null ? this.splitAt(i) : null }, join: function(e, t) { var n = t || 0; if (e && e !== this) { var i = e._segments , r = this.getLastSegment() , s = e.getLastSegment(); if (!s) return this; r && r._point.isClose(s._point, n) && e.reverse(); var u = e.getFirstSegment(); if (r && r._point.isClose(u._point, n)) r.setHandleOut(u._handleOut), this._add(i.slice(1)); else { var o = this.getFirstSegment(); o && o._point.isClose(u._point, n) && e.reverse(), s = e.getLastSegment(), o && o._point.isClose(s._point, n) ? (o.setHandleIn(s._handleIn), this._add(i.slice(0, i.length - 1), 0)) : this._add(i.slice()) } e._closed && this._add([i[0]]), e.remove() } var l = this.getFirstSegment() , f = this.getLastSegment(); return l !== f && l._point.isClose(f._point, n) && (l.setHandleIn(f._handleIn), f.remove(), this.setClosed(!0)), this }, reduce: function(e) { for (var t = this.getCurves(), n = e && e.simplify, i = n ? 1e-7 : 0, r = t.length - 1; r >= 0; r--) { var s = t[r]; !s.hasHandles() && (!s.hasLength(i) || n && s.isCollinear(s.getNext())) && s.remove() } return this }, reverse: function() { this._segments.reverse(); for (var e = 0, t = this._segments.length; e < t; e++) { var n = this._segments[e] , i = n._handleIn; n._handleIn = n._handleOut, n._handleOut = i, n._index = e } this._curves = null, this._changed(9) }, flatten: function(e) { for (var t = new kt(this,e || .25,256,!0), n = t.parts, i = n.length, r = [], s = 0; s < i; s++) r.push(new pe(n[s].curve.slice(0, 2))); !this._closed && i > 0 && r.push(new pe(n[i - 1].curve.slice(6))), this.setSegments(r) }, simplify: function(e) { var t = new yn(this).fit(e || 2.5); return t && this.setSegments(t), !!t }, smooth: function(e) { var t = this , n = e || {} , i = n.type || "asymmetric" , r = this._segments , s = r.length , u = this._closed; function o(Te, Ge) { var Re = Te && Te.index; if (Re != null) { var xe = Te.path; if (xe && xe !== t) throw new Error(Te._class + " " + Re + " of " + xe + " is not part of " + t); Ge && Te instanceof re && Re++ } else Re = typeof Te == "number" ? Te : Ge; return Math.min(Re < 0 && u ? Re % s : Re < 0 ? Re + s : Re, s - 1) } var l = u && n.from === a && n.to === a , f = o(n.from, 0) , g = o(n.to, s - 1); if (f > g) if (u) f -= s; else { var y = f; f = g, g = y } if (/^(?:asymmetric|continuous)$/.test(i)) { var _ = i === "asymmetric" , v = Math.min , b = g - f + 1 , T = b - 1 , x = l ? v(b, 4) : 1 , S = x , I = x , m = []; if (u || (S = v(1, f), I = v(1, s - g - 1)), T += S + I, T <= 1) return; for (var w = 0, E = f - S; w <= T; w++, E++) m[w] = r[(E < 0 ? E + s : E) % s]._point; for (var A = m[0]._x + 2 * m[1]._x, N = m[0]._y + 2 * m[1]._y, L = 2, R = T - 1, D = [A], V = [N], z = [L], G = [], H = [], w = 1; w < T; w++) { var K = w < R , $ = K || _ ? 1 : 2 , W = K ? 4 : _ ? 2 : 7 , te = K ? 4 : _ ? 3 : 8 , se = K ? 2 : _ ? 0 : 1 , ue = $ / L; L = z[w] = W - ue, A = D[w] = te * m[w]._x + se * m[w + 1]._x - ue * A, N = V[w] = te * m[w]._y + se * m[w + 1]._y - ue * N } G[R] = D[R] / z[R], H[R] = V[R] / z[R]; for (var w = T - 2; w >= 0; w--) G[w] = (D[w] - G[w + 1]) / z[w], H[w] = (V[w] - H[w + 1]) / z[w]; G[T] = (3 * m[T]._x - G[R]) / 2, H[T] = (3 * m[T]._y - H[R]) / 2; for (var w = S, Ie = T - I, E = f; w <= Ie; w++, E++) { var Ee = r[E < 0 ? E + s : E] , de = Ee._point , ve = G[w] - de._x , Oe = H[w] - de._y; (l || w < Ie) && Ee.setHandleOut(ve, Oe), (l || w > S) && Ee.setHandleIn(-ve, -Oe) } } else for (var w = f; w <= g; w++) r[w < 0 ? w + s : w].smooth(n, !l && w === f, !l && w === g) }, toShape: function(e) { if (!this._closed) return null; var t = this._segments, n, i, r, s; function u(_, v) { var b = t[_] , T = b.getNext() , x = t[v] , S = x.getNext(); return b._handleOut.isZero() && T._handleIn.isZero() && x._handleOut.isZero() && S._handleIn.isZero() && T._point.subtract(b._point).isCollinear(S._point.subtract(x._point)) } function o(_) { var v = t[_] , b = v.getPrevious() , T = v.getNext(); return b._handleOut.isZero() && v._handleIn.isZero() && v._handleOut.isZero() && T._handleIn.isZero() && v._point.subtract(b._point).isOrthogonal(T._point.subtract(v._point)) } function l(_) { var v = t[_] , b = v.getNext() , T = v._handleOut , x = b._handleIn , S = .5522847498307936; if (T.isOrthogonal(x)) { var I = v._point , m = b._point , w = new Se(I,T,!0).intersect(new Se(m,x,!0), !0); return w && O.isZero(T.getLength() / w.subtract(I).getLength() - S) && O.isZero(x.getLength() / w.subtract(m).getLength() - S) } return !1 } function f(_, v) { return t[_]._point.getDistance(t[v]._point) } if (!this.hasHandles() && t.length === 4 && u(0, 2) && u(1, 3) && o(1) ? (n = je.Rectangle, i = new J(f(0, 3),f(0, 1)), s = t[1]._point.add(t[2]._point).divide(2)) : t.length === 8 && l(0) && l(2) && l(4) && l(6) && u(1, 5) && u(3, 7) ? (n = je.Rectangle, i = new J(f(1, 6),f(0, 3)), r = i.subtract(new J(f(0, 7),f(1, 2))).divide(2), s = t[3]._point.add(t[4]._point).divide(2)) : t.length === 4 && l(0) && l(1) && l(2) && l(3) && (O.isZero(f(0, 2) - f(1, 3)) ? (n = je.Circle, r = f(0, 2) / 2) : (n = je.Ellipse, r = new J(f(2, 0) / 2,f(3, 1) / 2)), s = t[1]._point), n) { var g = this.getPosition(!0) , y = new n({ center: g, size: i, radius: r, insert: !1 }); return y.copyAttributes(this, !0), y._matrix.prepend(this._matrix), y.rotate(s.subtract(g).getAngle() + 90), (e === a || e) && y.insertAbove(this), y } return null }, toPath: "#clone", compare: function e(t) { if (!t || t instanceof ot) return e.base.call(this, t); var n = this.getCurves() , i = t.getCurves() , r = n.length , s = i.length; if (!r || !s) return r == s; for (var u = n[0].getValues(), o = [], l = 0, f, g = 0, y, _ = 0; _ < s; _++) { var x = i[_].getValues(); o.push(x); var v = re.getOverlaps(u, x); if (v) { f = !_ && v[0][0] > 0 ? s - 1 : _, y = v[0][1]; break } } for (var b = Math.abs, T = 1e-8, x = o[f], S; u && x; ) { var v = re.getOverlaps(u, x); if (v) { var I = v[0][0]; if (b(I - g) < T) { g = v[1][0], g === 1 && (u = ++l < r ? n[l].getValues() : null, g = 0); var m = v[0][1]; if (b(m - y) < T) { if (S || (S = [f, m]), y = v[1][1], y === 1 && (++f >= s && (f = 0), x = o[f] || i[f].getValues(), y = 0), !u) return S[0] === f && S[1] === y; continue } } } break } return !1 }, _hitTestSelf: function(e, t, n, i) { var r = this, s = this.getStyle(), u = this._segments, o = u.length, l = this._closed, f = t._tolerancePadding, g = f, y, _, v, b, T, x, S = t.stroke && s.hasStroke(), I = t.fill && s.hasFill(), m = t.curves, w = S ? s.getStrokeWidth() / 2 : I && t.tolerance > 0 || m ? 0 : null; w !== null && (w > 0 ? (y = s.getStrokeJoin(), _ = s.getStrokeCap(), v = s.getMiterLimit(), g = g.add(ke._getStrokePadding(w, i))) : y = _ = "round"); function E(G, H) { return e.subtract(G).divide(H).length <= 1 } function A(G, H, K) { if (!t.selected || H.isSelected()) { var $ = G._point; if (H !== $ && (H = H.add($)), E(H, g)) return new qe(K,r,{ segment: G, point: H }) } } function N(G, H) { return (H || t.segments) && A(G, G._point, "segment") || !H && t.handles && (A(G, G._handleIn, "handle-in") || A(G, G._handleOut, "handle-out")) } function L(G) { b.add(G) } function R(G) { var H = l || G._index > 0 && G._index < o - 1; if ((H ? y : _) === "round") return E(G._point, g); if (b = new ke({ internal: !0, closed: !0 }), H ? G.isSmooth() || ke._addBevelJoin(G, y, w, v, null, i, L, !0) : _ === "square" && ke._addSquareCap(G, _, w, null, i, L, !0), !b.isEmpty()) { var K; return b.contains(e) || (K = b.getNearestLocation(e)) && E(K.getPoint(), f) } } if (t.ends && !t.segments && !l) { if (x = N(u[0], !0) || N(u[o - 1], !0)) return x } else if (t.segments || t.handles) { for (var D = 0; D < o; D++) if (x = N(u[D])) return x } if (w !== null) { if (T = this.getNearestLocation(e), T) { var V = T.getTime(); V === 0 || V === 1 && o > 1 ? R(T.getSegment()) || (T = null) : E(T.getPoint(), g) || (T = null) } if (!T && y === "miter" && o > 1) for (var D = 0; D < o; D++) { var z = u[D]; if (e.getDistance(z._point) <= v * w && R(z)) { T = z.getLocation(); break } } } return !T && I && this._contains(e) || T && !S && !m ? new qe("fill",this) : T ? new qe(S ? "stroke" : "curve",this,{ location: T, point: T.getPoint() }) : null } }, d.each(re._evaluateMethods, function(e) { this[e + "At"] = function(t) { var n = this.getLocationAt(t); return n && n[e]() } }, { beans: !1, getLocationOf: function() { for (var e = C.read(arguments), t = this.getCurves(), n = 0, i = t.length; n < i; n++) { var r = t[n].getLocationOf(e); if (r) return r } return null }, getOffsetOf: function() { var e = this.getLocationOf.apply(this, arguments); return e ? e.getOffset() : null }, getLocationAt: function(e) { if (typeof e == "number") { for (var t = this.getCurves(), n = 0, i = 0, r = t.length; i < r; i++) { var s = n , u = t[i]; if (n += u.getLength(), n > e) return u.getLocationAt(e - s) } if (t.length > 0 && e <= this.getLength()) return new Ot(t[t.length - 1],1) } else if (e && e.getPath && e.getPath() === this) return e; return null }, getOffsetsWithTangent: function() { var e = C.read(arguments); if (e.isZero()) return []; for (var t = [], n = 0, i = this.getCurves(), r = 0, s = i.length; r < s; r++) { for (var u = i[r], o = u.getTimesWithTangent(e), l = 0, f = o.length; l < f; l++) { var g = n + u.getOffsetAtTime(o[l]); t.indexOf(g) < 0 && t.push(g) } n += u.length } return t } }), new function() { function e(n, i, r, s) { if (s <= 0) return; var u = s / 2, o = s - 2, l = u - 1, f = new Array(6), g, y; function _(I) { var m = f[I] , w = f[I + 1]; (g != m || y != w) && (n.beginPath(), n.moveTo(g, y), n.lineTo(m, w), n.stroke(), n.beginPath(), n.arc(m, w, u, 0, Math.PI * 2, !0), n.fill()) } for (var v = 0, b = i.length; v < b; v++) { var T = i[v] , x = T._selection; if (T._transformCoordinates(r, f), g = f[0], y = f[1], x & 2 && _(2), x & 4 && _(4), n.fillRect(g - u, y - u, s, s), o > 0 && !(x & 1)) { var S = n.fillStyle; n.fillStyle = "#ffffff", n.fillRect(g - l, y - l, o, o), n.fillStyle = S } } } function t(n, i, r) { var s = i._segments, u = s.length, o = new Array(6), l = !0, f, g, y, _, v, b, T, x; function S(m) { if (r) m._transformCoordinates(r, o), f = o[0], g = o[1]; else { var w = m._point; f = w._x, g = w._y } if (l) n.moveTo(f, g), l = !1; else { if (r) v = o[2], b = o[3]; else { var E = m._handleIn; v = f + E._x, b = g + E._y } v === f && b === g && T === y && x === _ ? n.lineTo(f, g) : n.bezierCurveTo(T, x, v, b, f, g) } if (y = f, _ = g, r) T = o[4], x = o[5]; else { var E = m._handleOut; T = y + E._x, x = _ + E._y } } for (var I = 0; I < u; I++) S(s[I]); i._closed && u > 0 && S(s[0]) } return { _draw: function(n, i, r, s) { var u = i.dontStart , o = i.dontFinish || i.clip , l = this.getStyle() , f = l.hasFill() , g = l.hasStroke() , y = l.getDashArray() , _ = !ae.support.nativeDash && g && y && y.length; u || n.beginPath(), (f || g && !_ || o) && (t(n, this, s), this._closed && n.closePath()); function v(m) { return y[(m % _ + _) % _] } if (!o && (f || g) && (this._setStyles(n, i, r), f && (n.fill(l.getFillRule()), n.shadowColor = "rgba(0,0,0,0)"), g)) { if (_) { u || n.beginPath(); for (var b = new kt(this,.25,32,!1,s), T = b.length, x = -l.getDashOffset(), S, I = 0; x > 0; ) x -= v(I--) + v(I--); for (; x < T; ) S = x + v(I++), (x > 0 || S > 0) && b.drawPart(n, Math.max(x, 0), Math.max(S, 0)), x = S + v(I++) } n.stroke() } }, _drawSelected: function(n, i) { n.beginPath(), t(n, this, i), n.stroke(), e(n, this._segments, i, ae.settings.handleSize) } } } , new function() { function e(t) { var n = t._segments; if (!n.length) throw new Error("Use a moveTo() command first"); return n[n.length - 1] } return { moveTo: function() { var t = this._segments; t.length === 1 && this.removeSegment(0), t.length || this._add([new pe(C.read(arguments))]) }, moveBy: function() { throw new Error("moveBy() is unsupported on Path items.") }, lineTo: function() { this._add([new pe(C.read(arguments))]) }, cubicCurveTo: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = C.read(t) , s = e(this); s.setHandleOut(n.subtract(s._point)), this._add([new pe(r,i.subtract(r))]) }, quadraticCurveTo: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = e(this)._point; this.cubicCurveTo(n.add(r.subtract(n).multiply(1 / 3)), n.add(i.subtract(n).multiply(1 / 3)), i) }, curveTo: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = d.pick(d.read(t), .5) , s = 1 - r , u = e(this)._point , o = n.subtract(u.multiply(s * s)).subtract(i.multiply(r * r)).divide(2 * r * s); if (o.isNaN()) throw new Error("Cannot put a curve through points with parameter = " + r); this.quadraticCurveTo(o, i) }, arcTo: function() { var t = arguments, n = Math.abs, i = Math.sqrt, r = e(this), s = r._point, u = C.read(t), o, l = d.peek(t), f = d.pick(l, !0), g, y, _, v; if (typeof f == "boolean") var b = s.add(u).divide(2) , o = b.add(b.subtract(s).rotate(f ? -90 : 90)); else if (d.remain(t) <= 2) o = u, u = C.read(t); else if (!s.equals(u)) { var T = J.read(t) , x = O.isZero; if (x(T.width) || x(T.height)) return this.lineTo(u); var S = d.read(t) , f = !!d.read(t) , I = !!d.read(t) , b = s.add(u).divide(2) , m = s.subtract(b).rotate(-S) , w = m.x , E = m.y , A = n(T.width) , N = n(T.height) , L = A * A , R = N * N , D = w * w , V = E * E , z = i(D / L + V / R); if (z > 1 && (A *= z, N *= z, L = A * A, R = N * N), z = (L * R - L * V - R * D) / (L * V + R * D), n(z) < 1e-12 && (z = 0), z < 0) throw new Error("Cannot create an arc with the given arguments"); g = new C(A * E / N,-N * w / A).multiply((I === f ? -1 : 1) * i(z)).rotate(S).add(b), v = new le().translate(g).rotate(S).scale(A, N), _ = v._inverseTransform(s), y = _.getDirectedAngle(v._inverseTransform(u)), !f && y > 0 ? y -= 360 : f && y < 0 && (y += 360) } if (o) { var G = new Se(s.add(o).divide(2),o.subtract(s).rotate(90),!0) , H = new Se(o.add(u).divide(2),u.subtract(o).rotate(90),!0) , K = new Se(s,u) , $ = K.getSide(o); if (g = G.intersect(H, !0), !g) { if (!$) return this.lineTo(u); throw new Error("Cannot create an arc with the given arguments") } _ = s.subtract(g), y = _.getDirectedAngle(u.subtract(g)); var W = K.getSide(g, !0); W === 0 ? y = $ * n(y) : $ === W && (y += y < 0 ? 360 : -360) } if (y) { for (var te = 1e-5, se = n(y), ue = se >= 360 ? 4 : Math.ceil((se - te) / 90), Ie = y / ue, Ee = Ie * Math.PI / 360, de = 4 / 3 * Math.sin(Ee) / (1 + Math.cos(Ee)), ve = [], Oe = 0; Oe <= ue; Oe++) { var m = u , Te = null; if (Oe < ue && (Te = _.rotate(90).multiply(de), v ? (m = v._transformPoint(_), Te = v._transformPoint(_.add(Te)).subtract(m)) : m = g.add(_)), !Oe) r.setHandleOut(Te); else { var Ge = _.rotate(-90).multiply(de); v && (Ge = v._transformPoint(_.add(Ge)).subtract(m)), ve.push(new pe(m,Ge,Te)) } _ = _.rotate(Ie) } this._add(ve) } }, lineBy: function() { var t = C.read(arguments) , n = e(this)._point; this.lineTo(n.add(t)) }, curveBy: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = d.read(t) , s = e(this)._point; this.curveTo(s.add(n), s.add(i), r) }, cubicCurveBy: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = C.read(t) , s = e(this)._point; this.cubicCurveTo(s.add(n), s.add(i), s.add(r)) }, quadraticCurveBy: function() { var t = arguments , n = C.read(t) , i = C.read(t) , r = e(this)._point; this.quadraticCurveTo(r.add(n), r.add(i)) }, arcBy: function() { var t = arguments , n = e(this)._point , i = n.add(C.read(t)) , r = d.pick(d.peek(t), !0); typeof r == "boolean" ? this.arcTo(i, r) : this.arcTo(i, n.add(C.read(t))) }, closePath: function(t) { this.setClosed(!0), this.join(this, t) } } } , { _getBounds: function(e, t) { var n = t.handle ? "getHandleBounds" : t.stroke ? "getStrokeBounds" : "getBounds"; return ke[n](this._segments, this._closed, this, e, t) }, statics: { getBounds: function(e, t, n, i, r, s) { var u = e[0]; if (!u) return new Y; var o = new Array(6) , l = u._transformCoordinates(i, new Array(6)) , f = l.slice(0, 2) , g = f.slice() , y = new Array(2); function _(T) { T._transformCoordinates(i, o); for (var x = 0; x < 2; x++) re._addBounds(l[x], l[x + 4], o[x + 2], o[x], x, s ? s[x] : 0, f, g, y); var S = l; l = o, o = S } for (var v = 1, b = e.length; v < b; v++) _(e[v]); return t && _(u), new Y(f[0],f[1],g[0] - f[0],g[1] - f[1]) }, getStrokeBounds: function(e, t, n, i, r) { var s = n.getStyle() , u = s.hasStroke() , o = s.getStrokeWidth() , l = u && n._getStrokeMatrix(i, r) , f = u && ke._getStrokePadding(o, l) , g = ke.getBounds(e, t, n, i, r, f); if (!u) return g; var y = o / 2 , _ = s.getStrokeJoin() , v = s.getStrokeCap() , b = s.getMiterLimit() , T = new Y(new J(f)); function x(A) { g = g.include(A) } function S(A) { g = g.unite(T.setCenter(A._point.transform(i))) } function I(A, N) { N === "round" || A.isSmooth() ? S(A) : ke._addBevelJoin(A, N, y, b, i, l, x) } function m(A, N) { N === "round" ? S(A) : ke._addSquareCap(A, N, y, i, l, x) } var w = e.length - (t ? 0 : 1); if (w > 0) { for (var E = 1; E < w; E++) I(e[E], _); t ? I(e[0], _) : (m(e[0], v), m(e[e.length - 1], v)) } return g }, _getStrokePadding: function(e, t) { if (!t) return [e, e]; var n = new C(e,0).transform(t) , i = new C(0,e).transform(t) , r = n.getAngleInRadians() , s = n.getLength() , u = i.getLength() , o = Math.sin(r) , l = Math.cos(r) , f = Math.tan(r) , g = Math.atan2(u * f, s) , y = Math.atan2(u, f * s); return [Math.abs(s * Math.cos(g) * l + u * Math.sin(g) * o), Math.abs(u * Math.sin(y) * l + s * Math.cos(y) * o)] }, _addBevelJoin: function(e, t, n, i, r, s, u, o) { var l = e.getCurve() , f = l.getPrevious() , g = l.getPoint1().transform(r) , y = f.getNormalAtTime(1).multiply(n).transform(s) , _ = l.getNormalAtTime(0).multiply(n).transform(s) , v = y.getDirectedAngle(_); if ((v < 0 || v >= 180) && (y = y.negate(), _ = _.negate()), o && u(g), u(g.add(y)), t === "miter") { var b = new Se(g.add(y),new C(-y.y,y.x),!0).intersect(new Se(g.add(_),new C(-_.y,_.x),!0), !0); b && g.getDistance(b) <= i * n && u(b) } u(g.add(_)) }, _addSquareCap: function(e, t, n, i, r, s, u) { var o = e._point.transform(i) , l = e.getLocation() , f = l.getNormal().multiply(l.getTime() === 0 ? n : -n).transform(r); t === "square" && (u && (s(o.subtract(f)), s(o.add(f))), o = o.add(f.rotate(-90))), s(o.add(f)), s(o.subtract(f)) }, getHandleBounds: function(e, t, n, i, r) { var s = n.getStyle(), u = r.stroke && s.hasStroke(), o, l; if (u) { var f = n._getStrokeMatrix(i, r) , g = s.getStrokeWidth() / 2 , y = g; s.getStrokeJoin() === "miter" && (y = g * s.getMiterLimit()), s.getStrokeCap() === "square" && (y = Math.max(y, g * Math.SQRT2)), o = ke._getStrokePadding(g, f), l = ke._getStrokePadding(y, f) } for (var _ = new Array(6), v = 1 / 0, b = -v, T = v, x = b, S = 0, I = e.length; S < I; S++) { var m = e[S]; m._transformCoordinates(i, _); for (var w = 0; w < 6; w += 2) { var E = w ? o : l , A = E ? E[0] : 0 , N = E ? E[1] : 0 , L = _[w] , R = _[w + 1] , D = L - A , V = L + A , z = R - N , G = R + N; D < v && (v = D), V > b && (b = V), z < T && (T = z), G > x && (x = G) } } return new Y(v,T,b - v,x - T) } } }); ke.inject({ statics: new function() { var e = .5522847498307936 , t = [new pe([-1, 0],[0, e],[0, -e]), new pe([0, -1],[-e, 0],[e, 0]), new pe([1, 0],[0, -e],[0, e]), new pe([0, 1],[e, 0],[-e, 0])]; function n(r, s, u) { var o = d.getNamed(u) , l = new ke(o && (o.insert == !0 ? oe.INSERT : o.insert == !1 ? oe.NO_INSERT : null)); return l._add(r), l._closed = s, l.set(o, oe.INSERT) } function i(r, s, u) { for (var o = new Array(4), l = 0; l < 4; l++) { var f = t[l]; o[l] = new pe(f._point.multiply(s).add(r),f._handleIn.multiply(s),f._handleOut.multiply(s)) } return n(o, !0, u) } return { Line: function() { var r = arguments; return n([new pe(C.readNamed(r, "from")), new pe(C.readNamed(r, "to"))], !1, r) }, Circle: function() { var r = arguments , s = C.readNamed(r, "center") , u = d.readNamed(r, "radius"); return i(s, new J(u), r) }, Rectangle: function() { var r = arguments, s = Y.readNamed(r, "rectangle"), u = J.readNamed(r, "radius", 0, { readNull: !0 }), o = s.getBottomLeft(!0), l = s.getTopLeft(!0), f = s.getTopRight(!0), g = s.getBottomRight(!0), y; if (!u || u.isZero()) y = [new pe(o), new pe(l), new pe(f), new pe(g)]; else { u = J.min(u, s.getSize(!0).divide(2)); var _ = u.width , v = u.height , b = _ * e , T = v * e; y = [new pe(o.add(_, 0),null,[-b, 0]), new pe(o.subtract(0, v),[0, T]), new pe(l.add(0, v),null,[0, -T]), new pe(l.add(_, 0),[-b, 0],null), new pe(f.subtract(_, 0),null,[b, 0]), new pe(f.add(0, v),[0, -T],null), new pe(g.subtract(0, v),null,[0, T]), new pe(g.subtract(_, 0),[b, 0])] } return n(y, !0, r) }, RoundRectangle: "#Rectangle", Ellipse: function() { var r = arguments , s = je._readEllipse(r); return i(s.center, s.radius, r) }, Oval: "#Ellipse", Arc: function() { var r = arguments , s = C.readNamed(r, "from") , u = C.readNamed(r, "through") , o = C.readNamed(r, "to") , l = d.getNamed(r) , f = new ke(l && l.insert == !1 && oe.NO_INSERT); return f.moveTo(s), f.arcTo(u, o), f.set(l) }, RegularPolygon: function() { for (var r = arguments, s = C.readNamed(r, "center"), u = d.readNamed(r, "sides"), o = d.readNamed(r, "radius"), l = 360 / u, f = u % 3 === 0, g = new C(0,f ? -o : o), y = f ? -1 : .5, _ = new Array(u), v = 0; v < u; v++) _[v] = new pe(s.add(g.rotate((v + y) * l))); return n(_, !0, r) }, Star: function() { for (var r = arguments, s = C.readNamed(r, "center"), u = d.readNamed(r, "points") * 2, o = d.readNamed(r, "radius1"), l = d.readNamed(r, "radius2"), f = 360 / u, g = new C(0,-1), y = new Array(u), _ = 0; _ < u; _++) y[_] = new pe(s.add(g.rotate(f * _).multiply(_ % 2 ? l : o))); return n(y, !0, r) } } } }); var ot = Ft.extend({ _class: "CompoundPath", _serializeFields: { children: [] }, beans: !0, initialize: function(t) { this._children = [], this._namedChildren = {}, this._initialize(t) || (typeof t == "string" ? this.setPathData(t) : this.addChildren(Array.isArray(t) ? t : arguments)) }, insertChildren: function e(t, n) { var i = n , r = i[0]; r && typeof r[0] == "number" && (i = [i]); for (var s = n.length - 1; s >= 0; s--) { var u = i[s]; i === n && !(u instanceof ke) && (i = d.slice(i)), Array.isArray(u) ? i[s] = new ke({ segments: u, insert: !1 }) : u instanceof ot && (i.splice.apply(i, [s, 1].concat(u.removeChildren())), u.remove()) } return e.base.call(this, t, i) }, reduce: function e(t) { for (var n = this._children, i = n.length - 1; i >= 0; i--) { var r = n[i].reduce(t); r.isEmpty() && r.remove() } if (!n.length) { var r = new ke(oe.NO_INSERT); return r.copyAttributes(this), r.insertAbove(this), this.remove(), r } return e.base.call(this) }, isClosed: function() { for (var e = this._children, t = 0, n = e.length; t < n; t++) if (!e[t]._closed) return !1; return !0 }, setClosed: function(e) { for (var t = this._children, n = 0, i = t.length; n < i; n++) t[n].setClosed(e) }, getFirstSegment: function() { var e = this.getFirstChild(); return e && e.getFirstSegment() }, getLastSegment: function() { var e = this.getLastChild(); return e && e.getLastSegment() }, getCurves: function() { for (var e = this._children, t = [], n = 0, i = e.length; n < i; n++) d.push(t, e[n].getCurves()); return t }, getFirstCurve: function() { var e = this.getFirstChild(); return e && e.getFirstCurve() }, getLastCurve: function() { var e = this.getLastChild(); return e && e.getLastCurve() }, getArea: function() { for (var e = this._children, t = 0, n = 0, i = e.length; n < i; n++) t += e[n].getArea(); return t }, getLength: function() { for (var e = this._children, t = 0, n = 0, i = e.length; n < i; n++) t += e[n].getLength(); return t }, getPathData: function(e, t) { for (var n = this._children, i = [], r = 0, s = n.length; r < s; r++) { var u = n[r] , o = u._matrix; i.push(u.getPathData(e && !o.isIdentity() ? e.appended(o) : e, t)) } return i.join("") }, _hitTestChildren: function e(t, n, i) { return e.base.call(this, t, n.class === ke || n.type === "path" ? n : d.set({}, n, { fill: !1 }), i) }, _draw: function(e, t, n, i) { var r = this._children; if (r.length) { t = t.extend({ dontStart: !0, dontFinish: !0 }), e.beginPath(); for (var s = 0, u = r.length; s < u; s++) r[s].draw(e, t, i); if (!t.clip) { this._setStyles(e, t, n); var o = this._style; o.hasFill() && (e.fill(o.getFillRule()), e.shadowColor = "rgba(0,0,0,0)"), o.hasStroke() && e.stroke() } } }, _drawSelected: function(e, t, n) { for (var i = this._children, r = 0, s = i.length; r < s; r++) { var u = i[r] , o = u._matrix; n[u._id] || u._drawSelected(e, o.isIdentity() ? t : t.appended(o)) } } }, new function() { function e(t, n) { var i = t._children; if (n && !i.length) throw new Error("Use a moveTo() command first"); return i[i.length - 1] } return d.each(["lineTo", "cubicCurveTo", "quadraticCurveTo", "curveTo", "arcTo", "lineBy", "cubicCurveBy", "quadraticCurveBy", "curveBy", "arcBy"], function(t) { this[t] = function() { var n = e(this, !0); n[t].apply(n, arguments) } }, { moveTo: function() { var t = e(this) , n = t && t.isEmpty() ? t : new ke(oe.NO_INSERT); n !== t && this.addChild(n), n.moveTo.apply(n, arguments) }, moveBy: function() { var t = e(this, !0) , n = t && t.getLastSegment() , i = C.read(arguments); this.moveTo(n ? i.add(n._point) : i) }, closePath: function(t) { e(this, !0).closePath(t) } }) } , d.each(["reverse", "flatten", "simplify", "smooth"], function(e) { this[e] = function(t) { for (var n = this._children, i, r = 0, s = n.length; r < s; r++) i = n[r][e](t) || i; return i } }, {})); Ft.inject(new function() { var e = Math.min , t = Math.max , n = Math.abs , i = { unite: { 1: !0, 2: !0 }, intersect: { 2: !0 }, subtract: { 1: !0 }, exclude: { 1: !0, "-1": !0 } }; function r(S) { return S._children || [S] } function s(S, I) { var m = S.clone(!1).reduce({ simplify: !0 }).transform(null, !0, !0); if (I) { for (var w = r(m), E = 0, A = w.length; E < A; E++) { var S = w[E]; !S._closed && !S.isEmpty() && (S.closePath(1e-12), S.getFirstSegment().setHandleIn(0, 0), S.getLastSegment().setHandleOut(0, 0)) } m = m.resolveCrossings().reorient(m.getFillRule() === "nonzero", !0) } return m } function u(S, I, m, w, E) { var A = new ot(oe.NO_INSERT); return A.addChildren(S, !0), A = A.reduce({ simplify: I }), E && E.insert == !1 || A.insertAbove(w && m.isSibling(w) && m.getIndex() < w.getIndex() ? w : m), A.copyAttributes(m, !0), A } function o(S) { return S.hasOverlap() || S.isCrossing() } function l(S, I, m, w) { if (w && (w.trace == !1 || w.stroke) && /^(subtract|intersect)$/.test(m)) return f(S, I, m); var E = s(S, !0) , A = I && S !== I && s(I, !0) , N = i[m]; N[m] = !0, A && (N.subtract || N.exclude) ^ (A.isClockwise() ^ E.isClockwise()) && A.reverse(); var L = v(Ot.expand(E.getIntersections(A, o))), R = r(E), D = A && r(A), V = [], z = [], G; function H(Te) { for (var Ge = 0, Re = Te.length; Ge < Re; Ge++) { var xe = Te[Ge]; d.push(V, xe._segments), d.push(z, xe.getCurves()), xe._overlapsOnly = !0 } } function K(Te) { for (var Ge = [], Re = 0, xe = Te && Te.length; Re < xe; Re++) Ge.push(z[Te[Re]]); return Ge } if (L.length) { H(R), D && H(D); for (var $ = new Array(z.length), W = 0, te = z.length; W < te; W++) $[W] = z[W].getValues(); for (var se = q.findCurveBoundsCollisions($, $, 0, !0), ue = {}, W = 0; W < z.length; W++) { var Ie = z[W] , Ee = Ie._path._id , de = ue[Ee] = ue[Ee] || {}; de[Ie.getIndex()] = { hor: K(se[W].hor), ver: K(se[W].ver) } } for (var W = 0, te = L.length; W < te; W++) T(L[W]._segment, E, A, ue, N); for (var W = 0, te = V.length; W < te; W++) { var ve = V[W] , Oe = ve._intersection; ve._winding || T(ve, E, A, ue, N), Oe && Oe._overlap || (ve._path._overlapsOnly = !1) } G = x(V, N) } else G = _(D ? R.concat(D) : R.slice(), function(Te) { return !!N[Te] }); return u(G, !0, S, I, w) } function f(S, I, m) { var w = s(S) , E = s(I) , A = w.getIntersections(E, o) , N = m === "subtract" , L = m === "divide" , R = {} , D = []; function V(H) { if (!R[H._id] && (L || E.contains(H.getPointAt(H.getLength() / 2)) ^ N)) return D.unshift(H), R[H._id] = !0 } for (var z = A.length - 1; z >= 0; z--) { var G = A[z].split(); G && (V(G) && G.getFirstSegment().setHandleIn(0, 0), w.getLastSegment().setHandleOut(0, 0)) } return V(w), u(D, !1, S, I) } function g(S, I) { for (var m = S; m; ) { if (m === I) return; m = m._previous } for (; S._next && S._next !== I; ) S = S._next; if (!S._next) { for (; I._previous; ) I = I._previous; S._next = I, I._previous = S } } function y(S) { for (var I = S.length - 1; I >= 0; I--) S[I].clearHandles() } function _(S, I, m) { var w = S && S.length; if (w) { var E = d.each(S, function(se, ue) { this[se._id] = { container: null, winding: se.isClockwise() ? 1 : -1, index: ue } }, {}) , A = S.slice().sort(function(se, ue) { return n(ue.getArea()) - n(se.getArea()) }) , N = A[0] , L = q.findItemBoundsCollisions(A, null, O.GEOMETRIC_EPSILON); m == null && (m = N.isClockwise()); for (var R = 0; R < w; R++) { var D = A[R] , V = E[D._id] , z = 0 , G = L[R]; if (G) { for (var H = null, K = G.length - 1; K >= 0; K--) if (G[K] < R) { H = H || D.getInteriorPoint(); var $ = A[G[K]]; if ($.contains(H)) { var W = E[$._id]; z = W.winding, V.winding += z, V.container = W.exclude ? W.container : $; break } } } if (I(V.winding) === I(z)) V.exclude = !0, S[V.index] = null; else { var te = V.container; D.setClockwise(te ? !te.isClockwise() : m) } } } return S } function v(S, I, m) { var w = I && [], E = 1e-8, A = 1 - E, N = !1, L = m || [], R = m && {}, D, V, z; function G(Ge) { return Ge._path._id + "." + Ge._segment1._index } for (var H = (m && m.length) - 1; H >= 0; H--) { var K = m[H]; K._path && (R[G(K)] = !0) } for (var H = S.length - 1; H >= 0; H--) { var $ = S[H], W = $._time, te = W, se = I && !I($), K = $._curve, ue; if (K && (K !== V ? (N = !K.hasHandles() || R && R[G(K)], D = [], z = null, V = K) : z >= E && (W /= z)), se) { D && D.push($); continue } else I && w.unshift($); if (z = te, W < E) ue = K._segment1; else if (W > A) ue = K._segment2; else { var Ie = K.divideAtTime(W, !0); N && L.push(K, Ie), ue = Ie._segment1; for (var Ee = D.length - 1; Ee >= 0; Ee--) { var de = D[Ee]; de._time = (de._time - W) / (1 - W) } } $._setSegment(ue); var ve = ue._intersection , Oe = $._intersection; if (ve) { g(ve, Oe); for (var Te = ve; Te; ) g(Te._intersection, ve), Te = Te._next } else ue._intersection = Oe } return m || y(L), w || S } function b(S, I, m, w, E) { var A = Array.isArray(I) ? I : I[m ? "hor" : "ver"], N = m ? 1 : 0, L = N ^ 1, R = [S.x, S.y], D = R[N], V = R[L], z = 1e-9, G = 1e-6, H = D - z, K = D + z, $ = 0, W = 0, te = 0, se = 0, ue = !1, Ie = !1, Ee = 1, de = [], ve, Oe; function Te(Ye) { var ut = Ye[L + 0] , st = Ye[L + 6]; if (!(V < e(ut, st) || V > t(ut, st))) { var vt = Ye[N + 0] , Ht = Ye[N + 2] , fn = Ye[N + 4] , jt = Ye[N + 6]; if (ut === st) { (vt < K && jt > H || jt < K && vt > H) && (ue = !0); return } var Yt = V === ut ? 0 : V === st || H > t(vt, Ht, fn, jt) || K < e(vt, Ht, fn, jt) ? 1 : re.solveCubic(Ye, L, V, de, 0, 1) > 0 ? de[0] : 1 , Dt = Yt === 0 ? vt : Yt === 1 ? jt : re.getPoint(Ye, Yt)[m ? "y" : "x"] , Ct = ut > st ? 1 : -1 , Tn = ve[L] > ve[L + 6] ? 1 : -1 , $t = ve[N + 6]; return V !== ut ? (Dt < H ? te += Ct : Dt > K ? se += Ct : ue = !0, Dt > D - G && Dt < D + G && (Ee /= 2)) : (Ct !== Tn ? vt < H ? te += Ct : vt > K && (se += Ct) : vt != $t && ($t < K && Dt > K ? (se += Ct, ue = !0) : $t > H && Dt < H && (te += Ct, ue = !0)), Ee /= 4), ve = Ye, !E && Dt > H && Dt < K && re.getTangent(Ye, Yt)[m ? "x" : "y"] === 0 && b(S, I, !m, w, !0) } } function Ge(Ye) { var ut = Ye[L + 0] , st = Ye[L + 2] , vt = Ye[L + 4] , Ht = Ye[L + 6]; if (V <= t(ut, st, vt, Ht) && V >= e(ut, st, vt, Ht)) { for (var fn = Ye[N + 0], jt = Ye[N + 2], Yt = Ye[N + 4], Dt = Ye[N + 6], Ct = H > t(fn, jt, Yt, Dt) || K < e(fn, jt, Yt, Dt) ? [Ye] : re.getMonoCurves(Ye, m), Tn, $t = 0, Oi = Ct.length; $t < Oi; $t++) if (Tn = Te(Ct[$t])) return Tn } } for (var Re = 0, xe = A.length; Re < xe; Re++) { var ze = A[Re], De = ze._path, _t = ze.getValues(), gt; if ((!Re || A[Re - 1]._path !== De) && (ve = null, De._closed || (Oe = re.getValues(De.getLastCurve().getSegment2(), ze.getSegment1(), null, !w), Oe[L] !== Oe[L + 6] && (ve = Oe)), !ve)) { ve = _t; for (var Et = De.getLastCurve(); Et && Et !== ze; ) { var nt = Et.getValues(); if (nt[L] !== nt[L + 6]) { ve = nt; break } Et = Et.getPrevious() } } if (gt = Ge(_t)) return gt; if (Re + 1 === xe || A[Re + 1]._path !== De) { if (Oe && (gt = Ge(Oe))) return gt; ue && !te && !se && (te = se = De.isClockwise(w) ^ m ? 1 : -1), $ += te, W += se, te = se = 0, ue && (Ie = !0, ue = !1), Oe = null } } return $ = n($), W = n(W), { winding: t($, W), windingL: $, windingR: W, quality: Ee, onPath: Ie } } function T(S, I, m, w, E) { var A = [], N = S, L = 0, z; do { var R = S.getCurve(); if (R) { var D = R.getLength(); A.push({ segment: S, curve: R, length: D }), L += D } S = S.getNext() } while (S && !S._intersection && S !== N); for (var V = [.5, .25, .75], z = { winding: 0, quality: -1 }, G = .001, H = 1 - G, K = 0; K < V.length && z.quality < .5; K++) for (var D = L * V[K], $ = 0, W = A.length; $ < W; $++) { var te = A[$] , se = te.length; if (D <= se) { var R = te.curve , ue = R._path , Ie = ue._parent , Ee = Ie instanceof ot ? Ie : ue , de = O.clamp(R.getTimeAt(D), G, H) , ve = R.getPointAtTime(de) , Oe = n(R.getTangentAtTime(de).y) < Math.SQRT1_2 , Te = null; if (E.subtract && m) { var Ge = Ee === I ? m : I , Re = Ge._getWinding(ve, Oe, !0); if (Ee === I && Re.winding || Ee === m && !Re.winding) { if (Re.quality < 1) continue; Te = { winding: 0, quality: 1 } } } Te = Te || b(ve, w[ue._id][R.getIndex()], Oe, !0), Te.quality > z.quality && (z = Te); break } D -= se } for (var $ = A.length - 1; $ >= 0; $--) A[$].segment._winding = z } function x(S, I) { var m = [], w; function E(xe) { var ze; return !!(xe && !xe._visited && (!I || I[(ze = xe._winding || {}).winding] && !(I.unite && ze.winding === 2 && ze.windingL && ze.windingR))) } function A(xe) { if (xe) { for (var ze = 0, De = w.length; ze < De; ze++) if (xe === w[ze]) return !0 } return !1 } function N(xe) { for (var ze = xe._segments, De = 0, _t = ze.length; De < _t; De++) ze[De]._visited = !0 } function L(xe, ze) { var De = xe._intersection , _t = De , gt = []; ze && (w = [xe]); function Et(nt, Ye) { for (; nt && nt !== Ye; ) { var ut = nt._segment , st = ut && ut._path; if (st) { var vt = ut.getNext() || st.getFirstSegment() , Ht = vt._intersection; ut !== xe && (A(ut) || A(vt) || vt && E(ut) && (E(vt) || Ht && E(Ht._segment))) && gt.push(ut), ze && w.push(ut) } nt = nt._next } } if (De) { for (Et(De); De && De._previous; ) De = De._previous; Et(De, _t) } return gt } S.sort(function(xe, ze) { var De = xe._intersection , _t = ze._intersection , gt = !!(De && De._overlap) , Et = !!(_t && _t._overlap) , nt = xe._path , Ye = ze._path; return gt ^ Et ? gt ? 1 : -1 : !De ^ !_t ? De ? 1 : -1 : nt !== Ye ? nt._id - Ye._id : xe._index - ze._index }); for (var R = 0, D = S.length; R < D; R++) { var V = S[R], z = E(V), G = null, H = !1, K = !0, $ = [], W, te, se; if (z && V._path._overlapsOnly) { var ue = V._path , Ie = V._intersection._segment._path; ue.compare(Ie) && (ue.getArea() && m.push(ue.clone(!1)), N(ue), N(Ie), z = !1) } for (; z; ) { var Ee = !G , de = L(V, Ee) , ve = de.shift() , H = !Ee && (A(V) || A(ve)) , Oe = !H && ve; if (Ee && (G = new ke(oe.NO_INSERT), W = null), H) { (V.isFirst() || V.isLast()) && (K = V._path._closed), V._visited = !0; break } if (Oe && W && ($.push(W), W = null), W || (Oe && de.push(V), W = { start: G._segments.length, crossings: de, visited: te = [], handleIn: se }), Oe && (V = ve), !E(V)) { G.removeSegments(W.start); for (var Te = 0, Ge = te.length; Te < Ge; Te++) te[Te]._visited = !1; te.length = 0; do V = W && W.crossings.shift(), (!V || !V._path) && (V = null, W = $.pop(), W && (te = W.visited, se = W.handleIn)); while (W && !E(V)); if (!V) break } var Re = V.getNext(); G.add(new pe(V._point,se,Re && V._handleOut)), V._visited = !0, te.push(V), V = Re || V._path.getFirstSegment(), se = Re && Re._handleIn } H && (K && (G.getFirstSegment().setHandleIn(se), G.setClosed(K)), G.getArea() !== 0 && m.push(G)) } return m } return { _getWinding: function(S, I, m) { return b(S, this.getCurves(), I, m) }, unite: function(S, I) { return l(this, S, "unite", I) }, intersect: function(S, I) { return l(this, S, "intersect", I) }, subtract: function(S, I) { return l(this, S, "subtract", I) }, exclude: function(S, I) { return l(this, S, "exclude", I) }, divide: function(S, I) { return I && (I.trace == !1 || I.stroke) ? f(this, S, "divide") : u([this.subtract(S, I), this.intersect(S, I)], !0, this, S, I) }, resolveCrossings: function() { var S = this._children , I = S || [this]; function m(W, te) { var se = W && W._intersection; return se && se._overlap && se._path === te } var w = !1 , E = !1 , A = this.getIntersections(null, function(W) { return W.hasOverlap() && (w = !0) || W.isCrossing() && (E = !0) }) , N = w && E && []; if (A = Ot.expand(A), w) for (var L = v(A, function(W) { return W.hasOverlap() }, N), R = L.length - 1; R >= 0; R--) { var D = L[R] , V = D._path , z = D._segment , G = z.getPrevious() , H = z.getNext(); m(G, V) && m(H, V) && (z.remove(), G._handleOut._set(0, 0), H._handleIn._set(0, 0), G !== z && !G.getCurve().hasLength() && (H._handleIn.set(G._handleIn), G.remove())) } E && (v(A, w && function(W) { var te = W.getCurve() , se = W.getSegment() , ue = W._intersection , Ie = ue._curve , Ee = ue._segment; if (te && Ie && te._path && Ie._path) return !0; se && (se._intersection = null), Ee && (Ee._intersection = null) } , N), N && y(N), I = x(d.each(I, function(W) { d.push(this, W._segments) }, []))); var K = I.length, $; return K > 1 && S ? (I !== S && this.setChildren(I), $ = this) : K === 1 && !S && (I[0] !== this && this.setSegments(I[0].removeSegments()), $ = this), $ || ($ = new ot(oe.NO_INSERT), $.addChildren(I), $ = $.reduce(), $.copyAttributes(this), this.replaceWith($)), $ }, reorient: function(S, I) { var m = this._children; return m && m.length ? this.setChildren(_(this.removeChildren(), function(w) { return !!(S ? w : w & 1) }, I)) : I !== a && this.setClockwise(I), this }, getInteriorPoint: function() { var S = this.getBounds() , I = S.getCenter(!0); if (!this.contains(I)) { for (var m = this.getCurves(), w = I.y, E = [], A = [], N = 0, L = m.length; N < L; N++) { var R = m[N].getValues() , D = R[1] , V = R[3] , z = R[5] , G = R[7]; if (w >= e(D, V, z, G) && w <= t(D, V, z, G)) for (var H = re.getMonoCurves(R), K = 0, $ = H.length; K < $; K++) { var W = H[K] , te = W[1] , se = W[7]; if (te !== se && (w >= te && w <= se || w >= se && w <= te)) { var ue = w === te ? W[0] : w === se ? W[6] : re.solveCubic(W, 1, w, A, 0, 1) === 1 ? re.getPoint(W, A[0]).x : (W[0] + W[6]) / 2; E.push(ue) } } } E.length > 1 && (E.sort(function(Ie, Ee) { return Ie - Ee }), I.x = (E[0] + E[1]) / 2) } return I } } } ); var kt = d.extend({ _class: "PathFlattener", initialize: function(e, t, n, i, r) { var s = [], u = [], o = 0, l = 1 / (n || 32), f = e._segments, g = f[0], y; function _(x, S) { var I = re.getValues(x, S, r); s.push(I), v(I, x._index, 0, 1) } function v(x, S, I, m) { if (m - I > l && !(i && re.isStraight(x)) && !re.isFlatEnough(x, t || .25)) { var w = re.subdivide(x, .5) , E = (I + m) / 2; v(w[0], S, I, E), v(w[1], S, E, m) } else { var A = x[6] - x[0] , N = x[7] - x[1] , L = Math.sqrt(A * A + N * N); L > 0 && (o += L, u.push({ offset: o, curve: x, index: S, time: m })) } } for (var b = 1, T = f.length; b < T; b++) y = f[b], _(g, y), g = y; e._closed && _(y || g, f[0]), this.curves = s, this.parts = u, this.length = o, this.index = 0 }, _get: function(e) { for (var t = this.parts, n = t.length, i, r, s = this.index; r = s, !(!s || t[--s].offset < e); ) ; for (; r < n; r++) { var u = t[r]; if (u.offset >= e) { this.index = r; var o = t[r - 1] , l = o && o.index === u.index ? o.time : 0 , f = o ? o.offset : 0; return { index: u.index, time: l + (u.time - l) * (e - f) / (u.offset - f) } } } return { index: t[n - 1].index, time: 1 } }, drawPart: function(e, t, n) { for (var i = this._get(t), r = this._get(n), s = i.index, u = r.index; s <= u; s++) { var o = re.getPart(this.curves[s], s === i.index ? i.time : 0, s === r.index ? r.time : 1); s === i.index && e.moveTo(o[0], o[1]), e.bezierCurveTo.apply(e, o.slice(2)) } } }, d.each(re._evaluateMethods, function(e) { this[e + "At"] = function(t) { var n = this._get(t); return re[e](this.curves[n.index], n.time) } }, {})) , yn = d.extend({ initialize: function(e) { for (var t = this.points = [], n = e._segments, i = e._closed, r = 0, s, u = n.length; r < u; r++) { var o = n[r].point; (!s || !s.equals(o)) && t.push(s = o.clone()) } i && (t.unshift(t[t.length - 1]), t.push(t[1])), this.closed = i }, fit: function(e) { var t = this.points , n = t.length , i = null; return n > 0 && (i = [new pe(t[0])], n > 1 && (this.fitCubic(i, e, 0, n - 1, t[1].subtract(t[0]), t[n - 2].subtract(t[n - 1])), this.closed && (i.shift(), i.pop()))), i }, fitCubic: function(e, t, n, i, r, s) { var u = this.points; if (i - n === 1) { var o = u[n] , l = u[i] , f = o.getDistance(l) / 3; this.addCurve(e, [o, o.add(r.normalize(f)), l.add(s.normalize(f)), l]); return } for (var g = this.chordLengthParameterize(n, i), y = Math.max(t, t * t), _, v = !0, b = 0; b <= 4; b++) { var T = this.generateBezier(n, i, g, r, s) , x = this.findMaxError(n, i, T, g); if (x.error < t && v) { this.addCurve(e, T); return } if (_ = x.index, x.error >= y) break; v = this.reparameterize(n, i, g, T), y = x.error } var S = u[_ - 1].subtract(u[_ + 1]); this.fitCubic(e, t, n, _, r, S), this.fitCubic(e, t, _, i, S.negate(), s) }, addCurve: function(e, t) { var n = e[e.length - 1]; n.setHandleOut(t[1].subtract(t[0])), e.push(new pe(t[3],t[2].subtract(t[3]))) }, generateBezier: function(e, t, n, i, r) { for (var s = 1e-12, u = Math.abs, o = this.points, l = o[e], f = o[t], g = [[0, 0], [0, 0]], y = [0, 0], _ = 0, v = t - e + 1; _ < v; _++) { var b = n[_] , T = 1 - b , x = 3 * b * T , S = T * T * T , I = x * T , m = x * b , w = b * b * b , E = i.normalize(I) , A = r.normalize(m) , N = o[e + _].subtract(l.multiply(S + I)).subtract(f.multiply(m + w)); g[0][0] += E.dot(E), g[0][1] += E.dot(A), g[1][0] = g[0][1], g[1][1] += A.dot(A), y[0] += E.dot(N), y[1] += A.dot(N) } var L = g[0][0] * g[1][1] - g[1][0] * g[0][1], R, D; if (u(L) > s) { var V = g[0][0] * y[1] - g[1][0] * y[0] , z = y[0] * g[1][1] - y[1] * g[0][1]; R = z / L, D = V / L } else { var G = g[0][0] + g[0][1] , H = g[1][0] + g[1][1]; R = D = u(G) > s ? y[0] / G : u(H) > s ? y[1] / H : 0 } var K = f.getDistance(l), $ = s * K, W, te; if (R < $ || D < $) R = D = K / 3; else { var se = f.subtract(l); W = i.normalize(R), te = r.normalize(D), W.dot(se) - te.dot(se) > K * K && (R = D = K / 3, W = te = null) } return [l, l.add(W || i.normalize(R)), f.add(te || r.normalize(D)), f] }, reparameterize: function(e, t, n, i) { for (var r = e; r <= t; r++) n[r - e] = this.findRoot(i, this.points[r], n[r - e]); for (var r = 1, s = n.length; r < s; r++) if (n[r] <= n[r - 1]) return !1; return !0 }, findRoot: function(e, t, n) { for (var i = [], r = [], s = 0; s <= 2; s++) i[s] = e[s + 1].subtract(e[s]).multiply(3); for (var s = 0; s <= 1; s++) r[s] = i[s + 1].subtract(i[s]).multiply(2); var u = this.evaluate(3, e, n) , o = this.evaluate(2, i, n) , l = this.evaluate(1, r, n) , f = u.subtract(t) , g = o.dot(o) + f.dot(l); return O.isMachineZero(g) ? n : n - f.dot(o) / g }, evaluate: function(e, t, n) { for (var i = t.slice(), r = 1; r <= e; r++) for (var s = 0; s <= e - r; s++) i[s] = i[s].multiply(1 - n).add(i[s + 1].multiply(n)); return i[0] }, chordLengthParameterize: function(e, t) { for (var n = [0], i = e + 1; i <= t; i++) n[i - e] = n[i - e - 1] + this.points[i].getDistance(this.points[i - 1]); for (var i = 1, r = t - e; i <= r; i++) n[i] /= n[r]; return n }, findMaxError: function(e, t, n, i) { for (var r = Math.floor((t - e + 1) / 2), s = 0, u = e + 1; u < t; u++) { var o = this.evaluate(3, n, i[u - e]) , l = o.subtract(this.points[u]) , f = l.x * l.x + l.y * l.y; f >= s && (s = f, r = u) } return { error: s, index: r } } }) , Gt = oe.extend({ _class: "TextItem", _applyMatrix: !1, _canApplyMatrix: !1, _serializeFields: { content: null }, _boundsOptions: { stroke: !1, handle: !1 }, initialize: function(t) { this._content = "", this._lines = []; var n = t && d.isPlainObject(t) && t.x === a && t.y === a; this._initialize(n && t, !n && C.read(arguments)) }, _equals: function(e) { return this._content === e._content }, copyContent: function(e) { this.setContent(e._content) }, getContent: function() { return this._content }, setContent: function(e) { this._content = "" + e, this._lines = this._content.split(/\r\n|\n|\r/mg), this._changed(521) }, isEmpty: function() { return !this._content }, getCharacterStyle: "#getStyle", setCharacterStyle: "#setStyle", getParagraphStyle: "#getStyle", setParagraphStyle: "#setStyle" }) , Mt = Gt.extend({ _class: "PointText", initialize: function() { Gt.apply(this, arguments) }, getPoint: function() { var e = this._matrix.getTranslation(); return new Q(e.x,e.y,this,"setPoint") }, setPoint: function() { var e = C.read(arguments); this.translate(e.subtract(this._matrix.getTranslation())) }, _draw: function(e, t, n) { if (this._content) { this._setStyles(e, t, n); var i = this._lines , r = this._style , s = r.hasFill() , u = r.hasStroke() , o = r.getLeading() , l = e.shadowColor; e.font = r.getFontStyle(), e.textAlign = r.getJustification(); for (var f = 0, g = i.length; f < g; f++) { e.shadowColor = l; var y = i[f]; s && (e.fillText(y, 0, 0), e.shadowColor = "rgba(0,0,0,0)"), u && e.strokeText(y, 0, 0), e.translate(0, o) } } }, _getBounds: function(e, t) { var n = this._style , i = this._lines , r = i.length , s = n.getJustification() , u = n.getLeading() , o = this.getView().getTextWidth(n.getFontStyle(), i) , l = 0; s !== "left" && (l -= o / (s === "center" ? 2 : 1)); var f = new Y(l,r ? -.75 * u : 0,o,r * u); return e ? e._transformBounds(f, f) : f } }) , Xe = d.extend(new function() { var e = { gray: ["gray"], rgb: ["red", "green", "blue"], hsb: ["hue", "saturation", "brightness"], hsl: ["hue", "saturation", "lightness"], gradient: ["gradient", "origin", "destination", "highlight"] }, t = {}, n = { transparent: [0, 0, 0, 0] }, i; function r(o) { var l = o.match(/^#([\da-f]{2})([\da-f]{2})([\da-f]{2})([\da-f]{2})?$/i) || o.match(/^#([\da-f])([\da-f])([\da-f])([\da-f])?$/i), f = "rgb", g; if (l) { var y = l[4] ? 4 : 3; g = new Array(y); for (var _ = 0; _ < y; _++) { var v = l[_ + 1]; g[_] = parseInt(v.length == 1 ? v + v : v, 16) / 255 } } else if (l = o.match(/^(rgb|hsl)a?\((.*)\)$/)) { f = l[1], g = l[2].trim().split(/[,\s]+/g); for (var b = f === "hsl", _ = 0, T = Math.min(g.length, 4); _ < T; _++) { var x = g[_] , v = parseFloat(x); if (b) if (_ === 0) { var S = x.match(/([a-z]*)$/)[1]; v *= { turn: 360, rad: 180 / Math.PI, grad: .9 }[S] || 1 } else _ < 3 && (v /= 100); else _ < 3 && (v /= /%$/.test(x) ? 100 : 255); g[_] = v } } else { var I = n[o]; if (!I) if (h) { i || (i = Je.getContext(1, 1, { willReadFrequently: !0 }), i.globalCompositeOperation = "copy"), i.fillStyle = "rgba(0,0,0,0)", i.fillStyle = o, i.fillRect(0, 0, 1, 1); var m = i.getImageData(0, 0, 1, 1).data; I = n[o] = [m[0] / 255, m[1] / 255, m[2] / 255] } else I = [0, 0, 0]; g = I.slice() } return [f, g] } var s = [[0, 3, 1], [2, 0, 1], [1, 0, 3], [1, 2, 0], [3, 1, 0], [0, 1, 2]] , u = { "rgb-hsb": function(o, l, f) { var g = Math.max(o, l, f) , y = Math.min(o, l, f) , _ = g - y , v = _ === 0 ? 0 : (g == o ? (l - f) / _ + (l < f ? 6 : 0) : g == l ? (f - o) / _ + 2 : (o - l) / _ + 4) * 60; return [v, g === 0 ? 0 : _ / g, g] }, "hsb-rgb": function(o, l, f) { o = (o / 60 % 6 + 6) % 6; var y = Math.floor(o) , g = o - y , y = s[y] , _ = [f, f * (1 - l), f * (1 - l * g), f * (1 - l * (1 - g))]; return [_[y[0]], _[y[1]], _[y[2]]] }, "rgb-hsl": function(o, l, f) { var g = Math.max(o, l, f) , y = Math.min(o, l, f) , _ = g - y , v = _ === 0 , b = v ? 0 : (g == o ? (l - f) / _ + (l < f ? 6 : 0) : g == l ? (f - o) / _ + 2 : (o - l) / _ + 4) * 60 , T = (g + y) / 2 , x = v ? 0 : T < .5 ? _ / (g + y) : _ / (2 - g - y); return [b, x, T] }, "hsl-rgb": function(o, l, f) { if (o = (o / 360 % 1 + 1) % 1, l === 0) return [f, f, f]; for (var g = [o + 1 / 3, o, o - 1 / 3], y = f < .5 ? f * (1 + l) : f + l - f * l, _ = 2 * f - y, v = [], b = 0; b < 3; b++) { var T = g[b]; T < 0 && (T += 1), T > 1 && (T -= 1), v[b] = 6 * T < 1 ? _ + (y - _) * 6 * T : 2 * T < 1 ? y : 3 * T < 2 ? _ + (y - _) * (2 / 3 - T) * 6 : _ } return v }, "rgb-gray": function(o, l, f) { return [o * .2989 + l * .587 + f * .114] }, "gray-rgb": function(o) { return [o, o, o] }, "gray-hsb": function(o) { return [0, 0, o] }, "gray-hsl": function(o) { return [0, 0, o] }, "gradient-rgb": function() { return [] }, "rgb-gradient": function() { return [] } }; return d.each(e, function(o, l) { t[l] = [], d.each(o, function(f, g) { var y = d.capitalize(f) , _ = /^(hue|saturation)$/.test(f) , v = t[l][g] = l === "gradient" ? f === "gradient" ? function(b) { var T = this._components[0]; return b = xt.read(Array.isArray(b) ? b : arguments, 0, { readNull: !0 }), T !== b && (T && T._removeOwner(this), b && b._addOwner(this)), b } : function() { return C.read(arguments, 0, { readNull: f === "highlight", clone: !0 }) } : function(b) { return b == null || isNaN(b) ? 0 : +b } ; this["get" + y] = function() { return this._type === l || _ && /^hs[bl]$/.test(this._type) ? this._components[g] : this._convert(l)[g] } , this["set" + y] = function(b) { this._type !== l && !(_ && /^hs[bl]$/.test(this._type)) && (this._components = this._convert(l), this._properties = e[l], this._type = l), this._components[g] = v.call(this, b), this._changed() } }, this) }, { _class: "Color", _readIndex: !0, initialize: function o(l) { var f = arguments, g = this.__read, y = 0, _, v, b, T; Array.isArray(l) && (f = l, l = f[0]); var x = l != null && typeof l; if (x === "string" && l in e && (_ = l, l = f[1], Array.isArray(l) ? (v = l, b = f[2]) : (g && (y = 1), f = d.slice(f, 1), x = typeof l)), !v) { if (T = x === "number" ? f : x === "object" && l.length != null ? l : null, T) { _ || (_ = T.length >= 3 ? "rgb" : "gray"); var S = e[_].length; b = T[S], g && (y += T === arguments ? S + (b != null ? 1 : 0) : 1), T.length > S && (T = d.slice(T, 0, S)) } else if (x === "string") { var I = r(l); _ = I[0], v = I[1], v.length === 4 && (b = v[3], v.length--) } else if (x === "object") if (l.constructor === o) { if (_ = l._type, v = l._components.slice(), b = l._alpha, _ === "gradient") for (var m = 1, w = v.length; m < w; m++) { var E = v[m]; E && (v[m] = E.clone()) } } else if (l.constructor === xt) _ = "gradient", T = f; else { _ = "hue"in l ? "lightness"in l ? "hsl" : "hsb" : "gradient"in l || "stops"in l || "radial"in l ? "gradient" : "gray"in l ? "gray" : "rgb"; var A = e[_] , N = t[_]; this._components = v = []; for (var m = 0, w = A.length; m < w; m++) { var L = l[A[m]]; L == null && !m && _ === "gradient" && "stops"in l && (L = { stops: l.stops, radial: l.radial }), L = N[m].call(this, L), L != null && (v[m] = L) } b = l.alpha } g && _ && (y = 1) } if (this._type = _ || "rgb", !v) { this._components = v = []; for (var N = t[this._type], m = 0, w = N.length; m < w; m++) { var L = N[m].call(this, T && T[m]); L != null && (v[m] = L) } } return this._components = v, this._properties = e[this._type], this._alpha = b, g && (this.__read = y), this }, set: "#initialize", _serialize: function(o, l) { var f = this.getComponents(); return d.serialize(/^(gray|rgb)$/.test(this._type) ? f : [this._type].concat(f), o, !0, l) }, _changed: function() { this._canvasStyle = null, this._owner && (this._setter ? this._owner[this._setter](this) : this._owner._changed(129)) }, _convert: function(o) { var l; return this._type === o ? this._components.slice() : (l = u[this._type + "-" + o]) ? l.apply(this, this._components) : u["rgb-" + o].apply(this, u[this._type + "-rgb"].apply(this, this._components)) }, convert: function(o) { return new Xe(o,this._convert(o),this._alpha) }, getType: function() { return this._type }, setType: function(o) { this._components = this._convert(o), this._properties = e[o], this._type = o }, getComponents: function() { var o = this._components.slice(); return this._alpha != null && o.push(this._alpha), o }, getAlpha: function() { return this._alpha != null ? this._alpha : 1 }, setAlpha: function(o) { this._alpha = o == null ? null : Math.min(Math.max(o, 0), 1), this._changed() }, hasAlpha: function() { return this._alpha != null }, equals: function(o) { var l = d.isPlainValue(o, !0) ? Xe.read(arguments) : o; return l === this || l && this._class === l._class && this._type === l._type && this.getAlpha() === l.getAlpha() && d.equals(this._components, l._components) || !1 }, toString: function() { for (var o = this._properties, l = [], f = this._type === "gradient", g = k.instance, y = 0, _ = o.length; y < _; y++) { var v = this._components[y]; v != null && l.push(o[y] + ": " + (f ? v : g.number(v))) } return this._alpha != null && l.push("alpha: " + g.number(this._alpha)), "{ " + l.join(", ") + " }" }, toCSS: function(o) { var l = this._convert("rgb") , f = o || this._alpha == null ? 1 : this._alpha; function g(y) { return Math.round((y < 0 ? 0 : y > 1 ? 1 : y) * 255) } return l = [g(l[0]), g(l[1]), g(l[2])], f < 1 && l.push(f < 0 ? 0 : f), o ? "#" + ((1 << 24) + (l[0] << 16) + (l[1] << 8) + l[2]).toString(16).slice(1) : (l.length == 4 ? "rgba(" : "rgb(") + l.join(",") + ")" }, toCanvasStyle: function(o, l) { if (this._canvasStyle) return this._canvasStyle; if (this._type !== "gradient") return this._canvasStyle = this.toCSS(); var f = this._components, g = f[0], y = g._stops, _ = f[1], v = f[2], b = f[3], T = l && l.inverted(), x; if (T && (_ = T._transformPoint(_), v = T._transformPoint(v), b && (b = T._transformPoint(b))), g._radial) { var S = v.getDistance(_); if (b) { var I = b.subtract(_); I.getLength() > S && (b = _.add(I.normalize(S - .1))) } var m = b || _; x = o.createRadialGradient(m.x, m.y, 0, _.x, _.y, S) } else x = o.createLinearGradient(_.x, _.y, v.x, v.y); for (var w = 0, E = y.length; w < E; w++) { var A = y[w] , N = A._offset; x.addColorStop(N ?? w / (E - 1), A._color.toCanvasStyle()) } return this._canvasStyle = x }, transform: function(o) { if (this._type === "gradient") { for (var l = this._components, f = 1, g = l.length; f < g; f++) { var y = l[f]; o._transformPoint(y, y, !0) } this._changed() } }, statics: { _types: e, random: function() { var o = Math.random; return new Xe(o(),o(),o()) }, _setOwner: function(o, l, f) { return o && (o._owner && l && o._owner !== l && (o = o.clone()), !o._owner ^ !l && (o._owner = l || null, o._setter = f || null)), o } } }) } , new function() { var e = { add: function(t, n) { return t + n }, subtract: function(t, n) { return t - n }, multiply: function(t, n) { return t * n }, divide: function(t, n) { return t / n } }; return d.each(e, function(t, n) { this[n] = function(i) { i = Xe.read(arguments); for (var r = this._type, s = this._components, u = i._convert(r), o = 0, l = s.length; o < l; o++) u[o] = t(s[o], u[o]); return new Xe(r,u,this._alpha != null ? t(this._alpha, i.getAlpha()) : null) } }, {}) } ) , xt = d.extend({ _class: "Gradient", initialize: function(t, n) { this._id = B.get(), t && d.isPlainObject(t) && (this.set(t), t = n = null), this._stops == null && this.setStops(t || ["white", "black"]), this._radial == null && this.setRadial(typeof n == "string" && n === "radial" || n || !1) }, _serialize: function(e, t) { return t.add(this, function() { return d.serialize([this._stops, this._radial], e, !0, t) }) }, _changed: function() { for (var e = 0, t = this._owners && this._owners.length; e < t; e++) this._owners[e]._changed() }, _addOwner: function(e) { this._owners || (this._owners = []), this._owners.push(e) }, _removeOwner: function(e) { var t = this._owners ? this._owners.indexOf(e) : -1; t != -1 && (this._owners.splice(t, 1), this._owners.length || (this._owners = a)) }, clone: function() { for (var e = [], t = 0, n = this._stops.length; t < n; t++) e[t] = this._stops[t].clone(); return new xt(e,this._radial) }, getStops: function() { return this._stops }, setStops: function(e) { if (e.length < 2) throw new Error("Gradient stop list needs to contain at least two stops."); var t = this._stops; if (t) for (var n = 0, i = t.length; n < i; n++) t[n]._owner = a; t = this._stops = en.readList(e, 0, { clone: !0 }); for (var n = 0, i = t.length; n < i; n++) t[n]._owner = this; this._changed() }, getRadial: function() { return this._radial }, setRadial: function(e) { this._radial = e, this._changed() }, equals: function(e) { if (e === this) return !0; if (e && this._class === e._class) { var t = this._stops , n = e._stops , i = t.length; if (i === n.length) { for (var r = 0; r < i; r++) if (!t[r].equals(n[r])) return !1; return !0 } } return !1 } }) , en = d.extend({ _class: "GradientStop", initialize: function(t, n) { var i = t , r = n; typeof t == "object" && n === a && (Array.isArray(t) && typeof t[0] != "number" ? (i = t[0], r = t[1]) : ("color"in t || "offset"in t || "rampPoint"in t) && (i = t.color, r = t.offset || t.rampPoint || 0)), this.setColor(i), this.setOffset(r) }, clone: function() { return new en(this._color.clone(),this._offset) }, _serialize: function(e, t) { var n = this._color , i = this._offset; return d.serialize(i == null ? [n] : [n, i], e, !0, t) }, _changed: function() { this._owner && this._owner._changed(129) }, getOffset: function() { return this._offset }, setOffset: function(e) { this._offset = e, this._changed() }, getRampPoint: "#getOffset", setRampPoint: "#setOffset", getColor: function() { return this._color }, setColor: function() { Xe._setOwner(this._color, null), this._color = Xe._setOwner(Xe.read(arguments, 0), this, "setColor"), this._changed() }, equals: function(e) { return e === this || e && this._class === e._class && this._color.equals(e._color) && this._offset == e._offset || !1 } }) , Kt = d.extend(new function() { var e = { fillColor: null, fillRule: "nonzero", strokeColor: null, strokeWidth: 1, strokeCap: "butt", strokeJoin: "miter", strokeScaling: !0, miterLimit: 10, dashOffset: 0, dashArray: [], shadowColor: null, shadowBlur: 0, shadowOffset: new C, selectedColor: null } , t = d.set({}, e, { fontFamily: "sans-serif", fontWeight: "normal", fontSize: 12, leading: null, justification: "left" }) , n = d.set({}, t, { fillColor: new Xe }) , i = { strokeWidth: 193, strokeCap: 193, strokeJoin: 193, strokeScaling: 201, miterLimit: 193, fontFamily: 9, fontWeight: 9, fontSize: 9, font: 9, leading: 9, justification: 9 } , r = { beans: !0 } , s = { _class: "Style", beans: !0, initialize: function(o, l, f) { this._values = {}, this._owner = l, this._project = l && l._project || f || ae.project, this._defaults = !l || l instanceof We ? t : l instanceof Gt ? n : e, o && this.set(o) } }; return d.each(t, function(u, o) { var l = /Color$/.test(o) , f = o === "shadowOffset" , g = d.capitalize(o) , y = i[o] , _ = "set" + g , v = "get" + g; s[_] = function(b) { var T = this._owner , x = T && T._children , S = x && x.length > 0 && !(T instanceof ot); if (S) for (var I = 0, m = x.length; I < m; I++) x[I]._style[_](b); if ((o === "selectedColor" || !S) && o in this._defaults) { var w = this._values[o]; w !== b && (l && (w && (Xe._setOwner(w, null), w._canvasStyle = null), b && b.constructor === Xe && (b = Xe._setOwner(b, T, S && _))), this._values[o] = b, T && T._changed(y || 129)) } } , s[v] = function(b) { var T = this._owner, x = T && T._children, S = x && x.length > 0 && !(T instanceof ot), I; if (S && !b) for (var m = 0, w = x.length; m < w; m++) { var E = x[m]._style[v](); if (!m) I = E; else if (!d.equals(I, E)) return a } else if (o in this._defaults) { var I = this._values[o]; if (I === a) I = this._defaults[o], I && I.clone && (I = I.clone()); else { var A = l ? Xe : f ? C : null; A && !(I && I.constructor === A) && (this._values[o] = I = A.read([I], 0, { readNull: !0, clone: !0 })) } } return I && l && (I = Xe._setOwner(I, T, S && _)), I } , r[v] = function(b) { return this._style[v](b) } , r[_] = function(b) { this._style[_](b) } }), d.each({ Font: "FontFamily", WindingRule: "FillRule" }, function(u, o) { var l = "get" + o , f = "set" + o; s[l] = r[l] = "#get" + u, s[f] = r[f] = "#set" + u }), oe.inject(r), s } , { set: function(e) { var t = e instanceof Kt , n = t ? e._values : e; if (n) { for (var i in n) if (i in this._defaults) { var r = n[i]; this[i] = r && t && r.clone ? r.clone() : r } } }, equals: function(e) { function t(n, i, r) { var s = n._values , u = i._values , o = i._defaults; for (var l in s) { var f = s[l] , g = u[l]; if (!(r && l in u) && !d.equals(f, g === a ? o[l] : g)) return !1 } return !0 } return e === this || e && this._class === e._class && t(this, e) && t(e, this, !0) || !1 }, _dispose: function() { var e; e = this.getFillColor(), e && (e._canvasStyle = null), e = this.getStrokeColor(), e && (e._canvasStyle = null), e = this.getShadowColor(), e && (e._canvasStyle = null) }, hasFill: function() { var e = this.getFillColor(); return !!e && e.alpha > 0 }, hasStroke: function() { var e = this.getStrokeColor(); return !!e && e.alpha > 0 && this.getStrokeWidth() > 0 }, hasShadow: function() { var e = this.getShadowColor(); return !!e && e.alpha > 0 && (this.getShadowBlur() > 0 || !this.getShadowOffset().isZero()) }, getView: function() { return this._project._view }, getFontStyle: function() { var e = this.getFontSize(); return this.getFontWeight() + " " + e + (/[a-z]/i.test(e + "") ? " " : "px ") + this.getFontFamily() }, getFont: "#getFontFamily", setFont: "#setFontFamily", getLeading: function e() { var t = e.base.call(this) , n = this.getFontSize(); return /pt|em|%|px/.test(n) && (n = this.getView().getPixelSize(n)), t ?? n * 1.2 } }) , Ce = new function() { function e(t, n, i, r) { for (var s = ["", "webkit", "moz", "Moz", "ms", "o"], u = n[0].toUpperCase() + n.substring(1), o = 0; o < 6; o++) { var l = s[o] , f = l ? l + u : n; if (f in t) { if (i) t[f] = r; else return t[f]; break } } } return { getStyles: function(t) { var n = t && t.nodeType !== 9 ? t.ownerDocument : t , i = n && n.defaultView; return i && i.getComputedStyle(t, "") }, getBounds: function(t, n) { var i = t.ownerDocument, r = i.body, s = i.documentElement, u; try { u = t.getBoundingClientRect() } catch { u = { left: 0, top: 0, width: 0, height: 0 } } var o = u.left - (s.clientLeft || r.clientLeft || 0) , l = u.top - (s.clientTop || r.clientTop || 0); if (!n) { var f = i.defaultView; o += f.pageXOffset || s.scrollLeft || r.scrollLeft, l += f.pageYOffset || s.scrollTop || r.scrollTop } return new Y(o,l,u.width,u.height) }, getViewportBounds: function(t) { var n = t.ownerDocument , i = n.defaultView , r = n.documentElement; return new Y(0,0,i.innerWidth || r.clientWidth,i.innerHeight || r.clientHeight) }, getOffset: function(t, n) { return Ce.getBounds(t, n).getPoint() }, getSize: function(t) { return Ce.getBounds(t, !0).getSize() }, isInvisible: function(t) { return Ce.getSize(t).equals(new J(0,0)) }, isInView: function(t) { return !Ce.isInvisible(t) && Ce.getViewportBounds(t).intersects(Ce.getBounds(t, !0)) }, isInserted: function(t) { return p.body.contains(t) }, getPrefixed: function(t, n) { return t && e(t, n) }, setPrefixed: function(t, n, i) { if (typeof n == "object") for (var r in n) e(t, r, !0, n[r]); else e(t, n, !0, i) } } } , tt = { add: function(e, t) { if (e) for (var n in t) for (var i = t[n], r = n.split(/[\s,]+/g), s = 0, u = r.length; s < u; s++) { var o = r[s] , l = e === p && (o === "touchstart" || o === "touchmove") ? { passive: !1 } : !1; e.addEventListener(o, i, l) } }, remove: function(e, t) { if (e) for (var n in t) for (var i = t[n], r = n.split(/[\s,]+/g), s = 0, u = r.length; s < u; s++) e.removeEventListener(r[s], i, !1) }, getPoint: function(e) { var t = e.targetTouches ? e.targetTouches.length ? e.targetTouches[0] : e.changedTouches[0] : e; return new C(t.pageX || t.clientX + p.documentElement.scrollLeft,t.pageY || t.clientY + p.documentElement.scrollTop) }, getTarget: function(e) { return e.target || e.srcElement }, getRelatedTarget: function(e) { return e.relatedTarget || e.toElement }, getOffset: function(e, t) { return tt.getPoint(e).subtract(Ce.getOffset(t || tt.getTarget(e))) } }; tt.requestAnimationFrame = new function() { var e = Ce.getPrefixed(h, "requestAnimationFrame"), t = !1, n = [], i; function r() { var s = n; n = []; for (var u = 0, o = s.length; u < o; u++) s[u](); t = e && n.length, t && e(r) } return function(s) { n.push(s), e ? t || (e(r), t = !0) : i || (i = setInterval(r, 16.666666666666668)) } } ; var Ke = d.extend(M, { _class: "View", initialize: function e(t, n) { function i(y) { return n[y] || parseInt(n.getAttribute(y), 10) } function r() { var y = Ce.getSize(n); return y.isNaN() || y.isZero() ? new J(i("width"),i("height")) : y } var s; if (h && n) { this._id = n.getAttribute("id"), this._id == null && n.setAttribute("id", this._id = "paper-view-" + e._id++), tt.add(n, this._viewEvents); var u = "none"; if (Ce.setPrefixed(n.style, { userDrag: u, userSelect: u, touchAction: u, touchCallout: u, contentZooming: u, tapHighlightColor: "rgba(0,0,0,0)" }), F.hasAttribute(n, "resize")) { var o = this; tt.add(h, this._windowEvents = { resize: function() { o.setViewSize(r()) } }) } if (s = r(), F.hasAttribute(n, "stats") && typeof Stats < "u") { this._stats = new Stats; var l = this._stats.domElement , f = l.style , g = Ce.getOffset(n); f.position = "absolute", f.left = g.x + "px", f.top = g.y + "px", p.body.appendChild(l) } } else s = new J(n), n = null; this._project = t, this._scope = t._scope, this._element = n, this._pixelRatio || (this._pixelRatio = h && h.devicePixelRatio || 1), this._setElementSize(s.width, s.height), this._viewSize = s, e._views.push(this), e._viewsById[this._id] = this, (this._matrix = new le)._owner = this, e._focused || (e._focused = this), this._frameItems = {}, this._frameItemCount = 0, this._itemEvents = { native: {}, virtual: {} }, this._autoUpdate = !ae.agent.node, this._needsUpdate = !1 }, remove: function() { if (!this._project) return !1; Ke._focused === this && (Ke._focused = null), Ke._views.splice(Ke._views.indexOf(this), 1), delete Ke._viewsById[this._id]; var e = this._project; return e._view === this && (e._view = null), tt.remove(this._element, this._viewEvents), tt.remove(h, this._windowEvents), this._element = this._project = null, this.off("frame"), this._animate = !1, this._frameItems = {}, !0 }, _events: d.each(oe._itemHandlers.concat(["onResize", "onKeyDown", "onKeyUp"]), function(e) { this[e] = {} }, { onFrame: { install: function() { this.play() }, uninstall: function() { this.pause() } } }), _animate: !1, _time: 0, _count: 0, getAutoUpdate: function() { return this._autoUpdate }, setAutoUpdate: function(e) { this._autoUpdate = e, e && this.requestUpdate() }, update: function() {}, draw: function() { this.update() }, requestUpdate: function() { if (!this._requested) { var e = this; tt.requestAnimationFrame(function() { if (e._requested = !1, e._animate) { e.requestUpdate(); var t = e._element; (!Ce.getPrefixed(p, "hidden") || F.getAttribute(t, "keepalive") === "true") && Ce.isInView(t) && e._handleFrame() } e._autoUpdate && e.update() }), this._requested = !0 } }, play: function() { this._animate = !0, this.requestUpdate() }, pause: function() { this._animate = !1 }, _handleFrame: function() { ae = this._scope; var e = Date.now() / 1e3 , t = this._last ? e - this._last : 0; this._last = e, this.emit("frame", new d({ delta: t, time: this._time += t, count: this._count++ })), this._stats && this._stats.update() }, _animateItem: function(e, t) { var n = this._frameItems; t ? (n[e._id] = { item: e, time: 0, count: 0 }, ++this._frameItemCount === 1 && this.on("frame", this._handleFrameItems)) : (delete n[e._id], --this._frameItemCount === 0 && this.off("frame", this._handleFrameItems)) }, _handleFrameItems: function(e) { for (var t in this._frameItems) { var n = this._frameItems[t]; n.item.emit("frame", new d(e,{ time: n.time += e.delta, count: n.count++ })) } }, _changed: function() { this._project._changed(4097), this._bounds = this._decomposed = a }, getElement: function() { return this._element }, getPixelRatio: function() { return this._pixelRatio }, getResolution: function() { return this._pixelRatio * 72 }, getViewSize: function() { var e = this._viewSize; return new ne(e.width,e.height,this,"setViewSize") }, setViewSize: function() { var e = J.read(arguments) , t = e.subtract(this._viewSize); t.isZero() || (this._setElementSize(e.width, e.height), this._viewSize.set(e), this._changed(), this.emit("resize", { size: e, delta: t }), this._autoUpdate && this.update()) }, _setElementSize: function(e, t) { var n = this._element; n && (n.width !== e && (n.width = e), n.height !== t && (n.height = t)) }, getBounds: function() { return this._bounds || (this._bounds = this._matrix.inverted()._transformBounds(new Y(new C,this._viewSize))), this._bounds }, getSize: function() { return this.getBounds().getSize() }, isVisible: function() { return Ce.isInView(this._element) }, isInserted: function() { return Ce.isInserted(this._element) }, getPixelSize: function(e) { var t = this._element, n; if (t) { var i = t.parentNode , r = p.createElement("div"); r.style.fontSize = e, i.appendChild(r), n = parseFloat(Ce.getStyles(r).fontSize), i.removeChild(r) } else n = parseFloat(n); return n }, getTextWidth: function(e, t) { return 0 } }, d.each(["rotate", "scale", "shear", "skew"], function(e) { var t = e === "rotate"; this[e] = function() { var n = arguments , i = (t ? d : C).read(n) , r = C.read(n, 0, { readNull: !0 }); return this.transform(new le()[e](i, r || this.getCenter(!0))) } }, { _decompose: function() { return this._decomposed || (this._decomposed = this._matrix.decompose()) }, translate: function() { var e = new le; return this.transform(e.translate.apply(e, arguments)) }, getCenter: function() { return this.getBounds().getCenter() }, setCenter: function() { var e = C.read(arguments); this.translate(this.getCenter().subtract(e)) }, getZoom: function() { var e = this._decompose().scaling; return (e.x + e.y) / 2 }, setZoom: function(e) { this.transform(new le().scale(e / this.getZoom(), this.getCenter())) }, getRotation: function() { return this._decompose().rotation }, setRotation: function(e) { var t = this.getRotation(); t != null && e != null && this.rotate(e - t) }, getScaling: function() { var e = this._decompose().scaling; return new Q(e.x,e.y,this,"setScaling") }, setScaling: function() { var e = this.getScaling() , t = C.read(arguments, 0, { clone: !0, readNull: !0 }); e && t && this.scale(t.x / e.x, t.y / e.y) }, getMatrix: function() { return this._matrix }, setMatrix: function() { var e = this._matrix; e.set.apply(e, arguments) }, transform: function(e) { this._matrix.append(e) }, scrollBy: function() { this.translate(C.read(arguments).negate()) } }), { projectToView: function() { return this._matrix._transformPoint(C.read(arguments)) }, viewToProject: function() { return this._matrix._inverseTransform(C.read(arguments)) }, getEventPoint: function(e) { return this.viewToProject(tt.getOffset(e, this._element)) } }, { statics: { _views: [], _viewsById: {}, _id: 0, create: function(e, t) { p && typeof t == "string" && (t = p.getElementById(t)); var n = h ? Rt : Ke; return new n(e,t) } } }, new function() { if (!h) return; var e, t, n = !1, i = !1; function r(z) { var G = tt.getTarget(z); return G.getAttribute && Ke._viewsById[G.getAttribute("id")] } function s() { var z = Ke._focused; if (!z || !z.isVisible()) { for (var G = 0, H = Ke._views.length; G < H; G++) if ((z = Ke._views[G]).isVisible()) { Ke._focused = t = z; break } } } function u(z, G, H) { z._handleMouseEvent("mousemove", G, H) } var o, l, f; "onpointerdown"in h || h.PointerEvent || h.MSPointerEvent ? (o = "pointerdown MSPointerDown", l = "pointermove MSPointerMove", f = "pointerup pointercancel MSPointerUp MSPointerCancel") : (o = "touchstart", l = "touchmove", f = "touchend touchcancel", "ontouchstart"in h && navigator.userAgent.match(/mobile|tablet|ip(ad|hone|od)|android|silk/i) || (o += " mousedown", l += " mousemove", f += " mouseup")); var g = {} , y = { mouseout: function(z) { var G = Ke._focused , H = tt.getRelatedTarget(z); if (G && (!H || H.nodeName === "HTML")) { var K = tt.getOffset(z, G._element) , $ = K.x , W = Math.abs , te = W($) , se = 1 << 25 , ue = te - se; K.x = W(ue) < te ? ue * ($ < 0 ? -1 : 1) : $, u(G, z, G.viewToProject(K)) } }, scroll: s }; g[o] = function(z) { var G = Ke._focused = r(z); n || (n = !0, G._handleMouseEvent("mousedown", z)) } , y[l] = function(z) { var G = Ke._focused; if (!i) { var H = r(z); H ? G !== H && (G && u(G, z), e || (e = G), G = Ke._focused = t = H) : t && t === G && (e && !e.isInserted() && (e = null), G = Ke._focused = e, e = null, s()) } G && u(G, z) } , y[o] = function() { i = !0 } , y[f] = function(z) { var G = Ke._focused; G && n && G._handleMouseEvent("mouseup", z), i = n = !1 } , tt.add(p, y), tt.add(h, { load: s }); var _ = !1, v = !1, b = { doubleclick: "click", mousedrag: "mousemove" }, T = !1, x, S, I, m, w, E, A, N, L; function R(z, G, H, K, $, W, te) { var se = !1, ue; function Ie(Ee, de) { if (Ee.responds(de)) { if (ue || (ue = new wn(de,K,$,G || Ee,W ? $.subtract(W) : null)), Ee.emit(de, ue) && (_ = !0, ue.prevented && (v = !0), ue.stopped)) return se = !0 } else { var ve = b[de]; if (ve) return Ie(Ee, ve) } } for (; z && z !== te && !Ie(z, H); ) z = z._parent; return se } function D(z, G, H, K, $, W) { return z._project.removeOn(H), v = _ = !1, E && R(E, null, H, K, $, W) || G && G !== E && !G.isDescendant(E) && R(G, null, H === "mousedrag" ? "mousemove" : H, K, $, W, E) || R(z, E || G || z, H, K, $, W) } var V = { mousedown: { mousedown: 1, mousedrag: 1, click: 1, doubleclick: 1 }, mouseup: { mouseup: 1, mousedrag: 1, click: 1, doubleclick: 1 }, mousemove: { mousedrag: 1, mousemove: 1, mouseenter: 1, mouseleave: 1 } }; return { _viewEvents: g, _handleMouseEvent: function(z, G, H) { var K = this._itemEvents , $ = K.native[z] , W = z === "mousemove" , te = this._scope.tool , se = this; function ue(Ge) { return K.virtual[Ge] || se.responds(Ge) || te && te.responds(Ge) } W && n && ue("mousedrag") && (z = "mousedrag"), H || (H = this.getEventPoint(G)); var Ie = this.getBounds().contains(H) , Ee = $ && Ie && se._project.hitTest(H, { tolerance: 0, fill: !0, stroke: !0 }) , de = Ee && Ee.item || null , ve = !1 , Oe = {}; if (Oe[z.substr(5)] = !0, $ && de !== w && (w && R(w, null, "mouseleave", G, H), de && R(de, null, "mouseenter", G, H), w = de), T ^ Ie && (R(this, null, Ie ? "mouseenter" : "mouseleave", G, H), x = Ie ? this : null, ve = !0), (Ie || Oe.drag) && !H.equals(I) && (D(this, de, W ? z : "mousemove", G, H, I), ve = !0), T = Ie, Oe.down && Ie || Oe.up && S) { if (D(this, de, z, G, H, S), Oe.down) { if (L = de === A && Date.now() - N < 300, m = A = de, !v && de) { for (var Te = de; Te && !Te.responds("mousedrag"); ) Te = Te._parent; Te && (E = de) } S = H } else Oe.up && (!v && de === m && (N = Date.now(), D(this, de, L ? "doubleclick" : "click", G, H, S), L = !1), m = E = null); T = !1, ve = !0 } I = H, ve && te && (_ = te._handleMouseEvent(z, G, H, Oe) || _), G.cancelable !== !1 && (_ && !Oe.move || Oe.down && ue("mouseup")) && G.preventDefault() }, _handleKeyEvent: function(z, G, H, K) { var $ = this._scope, W = $.tool, te; function se(ue) { ue.responds(z) && (ae = $, ue.emit(z, te = te || new tn(z,G,H,K))) } this.isVisible() && (se(this), W && W.responds(z) && se(W)) }, _countItemEvent: function(z, G) { var H = this._itemEvents , K = H.native , $ = H.virtual; for (var W in V) K[W] = (K[W] || 0) + (V[W][z] || 0) * G; $[z] = ($[z] || 0) + G }, statics: { updateFocus: s, _resetState: function() { n = i = _ = T = !1, e = t = x = S = I = m = w = E = A = N = L = null } } } } ) , Rt = Ke.extend({ _class: "CanvasView", initialize: function(t, n) { if (!(n instanceof h.HTMLCanvasElement)) { var i = J.read(arguments, 1); if (i.isZero()) throw new Error("Cannot create CanvasView with the provided argument: " + d.slice(arguments, 1)); n = Je.getCanvas(i) } var r = this._context = n.getContext("2d"); if (r.save(), this._pixelRatio = 1, !/^off|false$/.test(F.getAttribute(n, "hidpi"))) { var s = h.devicePixelRatio || 1 , u = Ce.getPrefixed(r, "backingStorePixelRatio") || 1; this._pixelRatio = s / u } Ke.call(this, t, n), this._needsUpdate = !0 }, remove: function e() { return this._context.restore(), e.base.call(this) }, _setElementSize: function e(t, n) { var i = this._pixelRatio; if (e.base.call(this, t * i, n * i), i !== 1) { var r = this._element , s = this._context; if (!F.hasAttribute(r, "resize")) { var u = r.style; u.width = t + "px", u.height = n + "px" } s.restore(), s.save(), s.scale(i, i) } }, getContext: function() { return this._context }, getPixelSize: function e(t) { var n = ae.agent, i; if (n && n.firefox) i = e.base.call(this, t); else { var r = this._context , s = r.font; r.font = t + " serif", i = parseFloat(r.font), r.font = s } return i }, getTextWidth: function(e, t) { var n = this._context , i = n.font , r = 0; n.font = e; for (var s = 0, u = t.length; s < u; s++) r = Math.max(r, n.measureText(t[s]).width); return n.font = i, r }, update: function() { if (!this._needsUpdate) return !1; var e = this._project , t = this._context , n = this._viewSize; return t.clearRect(0, 0, n.width + 1, n.height + 1), e && e.draw(t, this._matrix, this._pixelRatio), this._needsUpdate = !1, !0 } }) , Zt = d.extend({ _class: "Event", initialize: function(t) { this.event = t, this.type = t && t.type }, prevented: !1, stopped: !1, preventDefault: function() { this.prevented = !0, this.event.preventDefault() }, stopPropagation: function() { this.stopped = !0, this.event.stopPropagation() }, stop: function() { this.stopPropagation(), this.preventDefault() }, getTimeStamp: function() { return this.event.timeStamp }, getModifiers: function() { return cn.modifiers } }) , tn = Zt.extend({ _class: "KeyEvent", initialize: function(t, n, i, r) { this.type = t, this.event = n, this.key = i, this.character = r }, toString: function() { return "{ type: '" + this.type + "', key: '" + this.key + "', character: '" + this.character + "', modifiers: " + this.getModifiers() + " }" } }) , cn = new function() { var e = { " ": "tab", " ": "space", "\b": "backspace", "\x7F": "delete", Spacebar: "space", Del: "delete", Win: "meta", Esc: "escape" }, t = { tab: " ", space: " ", enter: "\r" }, n = {}, i = {}, r, s, u = new d({ shift: !1, control: !1, alt: !1, meta: !1, capsLock: !1, space: !1 }).inject({ option: { get: function() { return this.alt } }, command: { get: function() { var f = ae && ae.agent; return f && f.mac ? this.meta : this.control } } }); function o(f) { var g = f.key || f.keyIdentifier; return g = /^U\+/.test(g) ? String.fromCharCode(parseInt(g.substr(2), 16)) : /^Arrow[A-Z]/.test(g) ? g.substr(5) : g === "Unidentified" || g === a ? String.fromCharCode(f.keyCode) : g, e[g] || (g.length > 1 ? d.hyphenate(g) : g.toLowerCase()) } function l(f, g, y, _) { var v = f ? "keydown" : "keyup", b = Ke._focused, T; if (n[g] = f, f ? i[g] = y : delete i[g], g.length > 1 && (T = d.camelize(g))in u) { u[T] = f; var x = ae && ae.agent; if (T === "meta" && x && x.mac) if (f) r = {}; else { for (var S in r) S in i && l(!1, S, r[S], _); r = null } } else f && r && (r[g] = y); b && b._handleKeyEvent(f ? "keydown" : "keyup", _, g, y) } return tt.add(p, { keydown: function(f) { var g = o(f) , y = ae && ae.agent; g.length > 1 || y && y.chrome && (f.altKey || y.mac && f.metaKey || !y.mac && f.ctrlKey) ? l(!0, g, t[g] || (g.length > 1 ? "" : g), f) : s = g }, keypress: function(f) { if (s) { var g = o(f) , y = f.charCode , _ = y >= 32 ? String.fromCharCode(y) : g.length > 1 ? "" : g; g !== s && (g = _.toLowerCase()), l(!0, g, _, f), s = null } }, keyup: function(f) { var g = o(f); g in i && l(!1, g, i[g], f) } }), tt.add(h, { blur: function(f) { for (var g in i) l(!1, g, i[g], f) } }), { modifiers: u, isDown: function(f) { return !!n[f] } } } , wn = Zt.extend({ _class: "MouseEvent", initialize: function(t, n, i, r, s) { this.type = t, this.event = n, this.point = i, this.target = r, this.delta = s }, toString: function() { return "{ type: '" + this.type + "', point: " + this.point + ", target: " + this.target + (this.delta ? ", delta: " + this.delta : "") + ", modifiers: " + this.getModifiers() + " }" } }) , bn = Zt.extend({ _class: "ToolEvent", _item: null, initialize: function(t, n, i) { this.tool = t, this.type = n, this.event = i }, _choosePoint: function(e, t) { return e || (t ? t.clone() : null) }, getPoint: function() { return this._choosePoint(this._point, this.tool._point) }, setPoint: function(e) { this._point = e }, getLastPoint: function() { return this._choosePoint(this._lastPoint, this.tool._lastPoint) }, setLastPoint: function(e) { this._lastPoint = e }, getDownPoint: function() { return this._choosePoint(this._downPoint, this.tool._downPoint) }, setDownPoint: function(e) { this._downPoint = e }, getMiddlePoint: function() { return !this._middlePoint && this.tool._lastPoint ? this.tool._point.add(this.tool._lastPoint).divide(2) : this._middlePoint }, setMiddlePoint: function(e) { this._middlePoint = e }, getDelta: function() { return !this._delta && this.tool._lastPoint ? this.tool._point.subtract(this.tool._lastPoint) : this._delta }, setDelta: function(e) { this._delta = e }, getCount: function() { return this.tool[/^mouse(down|up)$/.test(this.type) ? "_downCount" : "_moveCount"] }, setCount: function(e) { this.tool[/^mouse(down|up)$/.test(this.type) ? "downCount" : "count"] = e }, getItem: function() { if (!this._item) { var e = this.tool._scope.project.hitTest(this.getPoint()); if (e) { for (var t = e.item, n = t._parent; /^(Group|CompoundPath)$/.test(n._class); ) t = n, n = n._parent; this._item = t } } return this._item }, setItem: function(e) { this._item = e }, toString: function() { return "{ type: " + this.type + ", point: " + this.getPoint() + ", count: " + this.getCount() + ", modifiers: " + this.getModifiers() + " }" } }) , kn = Z.extend({ _class: "Tool", _list: "tools", _reference: "tool", _events: ["onMouseDown", "onMouseUp", "onMouseDrag", "onMouseMove", "onActivate", "onDeactivate", "onEditOptions", "onKeyDown", "onKeyUp"], initialize: function(t) { Z.call(this), this._moveCount = -1, this._downCount = -1, this.set(t) }, getMinDistance: function() { return this._minDistance }, setMinDistance: function(e) { this._minDistance = e, e != null && this._maxDistance != null && e > this._maxDistance && (this._maxDistance = e) }, getMaxDistance: function() { return this._maxDistance }, setMaxDistance: function(e) { this._maxDistance = e, this._minDistance != null && e != null && e < this._minDistance && (this._minDistance = e) }, getFixedDistance: function() { return this._minDistance == this._maxDistance ? this._minDistance : null }, setFixedDistance: function(e) { this._minDistance = this._maxDistance = e }, _handleMouseEvent: function(e, t, n, i) { ae = this._scope, i.drag && !this.responds(e) && (e = "mousemove"); var r = i.move || i.drag , s = this.responds(e) , u = this.minDistance , o = this.maxDistance , l = !1 , f = this; function g(_, v) { var b = n , T = r ? f._point : f._downPoint || b; if (r) { if (f._moveCount >= 0 && b.equals(T)) return !1; if (T && (_ != null || v != null)) { var x = b.subtract(T) , S = x.getLength(); if (S < (_ || 0)) return !1; v && (b = T.add(x.normalize(Math.min(S, v)))) } f._moveCount++ } return f._point = b, f._lastPoint = T || b, i.down && (f._moveCount = -1, f._downPoint = b, f._downCount++), !0 } function y() { s && (l = f.emit(e, new bn(f,e,t)) || l) } if (i.down) g(), y(); else if (i.up) g(null, o), y(); else if (s) for (; g(u, o); ) y(); return l } }) , Sn = d.extend(M, { _class: "Tween", statics: { easings: new d({ linear: function(e) { return e }, easeInQuad: function(e) { return e * e }, easeOutQuad: function(e) { return e * (2 - e) }, easeInOutQuad: function(e) { return e < .5 ? 2 * e * e : -1 + 2 * (2 - e) * e }, easeInCubic: function(e) { return e * e * e }, easeOutCubic: function(e) { return --e * e * e + 1 }, easeInOutCubic: function(e) { return e < .5 ? 4 * e * e * e : (e - 1) * (2 * e - 2) * (2 * e - 2) + 1 }, easeInQuart: function(e) { return e * e * e * e }, easeOutQuart: function(e) { return 1 - --e * e * e * e }, easeInOutQuart: function(e) { return e < .5 ? 8 * e * e * e * e : 1 - 8 * --e * e * e * e }, easeInQuint: function(e) { return e * e * e * e * e }, easeOutQuint: function(e) { return 1 + --e * e * e * e * e }, easeInOutQuint: function(e) { return e < .5 ? 16 * e * e * e * e * e : 1 + 16 * --e * e * e * e * e } }) }, initialize: function e(t, n, i, r, s, u) { this.object = t; var o = typeof s , l = o === "function"; this.type = l ? o : o === "string" ? s : "linear", this.easing = l ? s : e.easings[this.type], this.duration = r, this.running = !1, this._then = null, this._startTime = null; var f = n || i; this._keys = f ? Object.keys(f) : [], this._parsedKeys = this._parseKeys(this._keys), this._from = f && this._getState(n), this._to = f && this._getState(i), u !== !1 && this.start() }, then: function(e) { return this._then = e, this }, start: function() { return this._startTime = null, this.running = !0, this }, stop: function() { return this.running = !1, this }, update: function(e) { if (this.running) { e >= 1 && (e = 1, this.running = !1); for (var t = this.easing(e), n = this._keys, i = function(g) { return typeof g == "function" ? g(t, e) : g }, r = 0, s = n && n.length; r < s; r++) { var u = n[r] , o = i(this._from[u]) , l = i(this._to[u]) , f = o && l && o.__add && l.__add ? l.__subtract(o).__multiply(t).__add(o) : (l - o) * t + o; this._setProperty(this._parsedKeys[u], f) } this.responds("update") && this.emit("update", new d({ progress: e, factor: t })), !this.running && this._then && this._then(this.object) } return this }, _events: { onUpdate: {} }, _handleFrame: function(e) { var t = this._startTime , n = t ? (e - t) / this.duration : 0; t || (this._startTime = e), this.update(n) }, _getState: function(e) { for (var t = this._keys, n = {}, i = 0, r = t.length; i < r; i++) { var s = t[i], u = this._parsedKeys[s], o = this._getProperty(u), l; if (e) { var f = this._resolveValue(o, e[s]); this._setProperty(u, f), l = this._getProperty(u), l = l && l.clone ? l.clone() : l, this._setProperty(u, o) } else l = o && o.clone ? o.clone() : o; n[s] = l } return n }, _resolveValue: function(e, t) { if (t) { if (Array.isArray(t) && t.length === 2) { var n = t[0]; return n && n.match && n.match(/^[+\-\*\/]=/) ? this._calculate(e, n[0], t[1]) : t } else if (typeof t == "string") { var i = t.match(/^[+\-*/]=(.*)/); if (i) { var r = JSON.parse(i[1].replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2": ')); return this._calculate(e, t[0], r) } } } return t }, _calculate: function(e, t, n) { return ae.PaperScript.calculateBinary(e, t, n) }, _parseKeys: function(e) { for (var t = {}, n = 0, i = e.length; n < i; n++) { var r = e[n] , s = r.replace(/\.([^.]*)/g, "/$1").replace(/\[['"]?([^'"\]]*)['"]?\]/g, "/$1"); t[r] = s.split("/") } return t }, _getProperty: function(e, t) { for (var n = this.object, i = 0, r = e.length - (t || 0); i < r && n; i++) n = n[e[i]]; return n }, _setProperty: function(e, t) { var n = this._getProperty(e, 1); n && (n[e[e.length - 1]] = t) } }) , Bn = { request: function(e) { var t = new c.XMLHttpRequest; return t.open((e.method || "get").toUpperCase(), e.url, d.pick(e.async, !0)), e.mimeType && t.overrideMimeType(e.mimeType), t.onload = function() { var n = t.status; n === 0 || n === 200 ? e.onLoad && e.onLoad.call(t, t.responseText) : t.onerror() } , t.onerror = function() { var n = t.status , i = 'Could not load "' + e.url + '" (Status: ' + n + ")"; if (e.onError) e.onError(i, n); else throw new Error(i) } , t.send(null) } } , Je = d.exports.CanvasProvider = { canvases: [], getCanvas: function(e, t, n) { if (!h) return null; var i, r = !0; typeof e == "object" && (t = e.height, e = e.width), this.canvases.length ? i = this.canvases.pop() : (i = p.createElement("canvas"), r = !1); var s = i.getContext("2d", n || {}); if (!s) throw new Error("Canvas " + i + " is unable to provide a 2D context."); return i.width === e && i.height === t ? r && s.clearRect(0, 0, e + 1, t + 1) : (i.width = e, i.height = t), s.save(), i }, getContext: function(e, t, n) { var i = this.getCanvas(e, t, n); return i ? i.getContext("2d", n || {}) : null }, release: function(e) { var t = e && e.canvas ? e.canvas : e; t && t.getContext && (t.getContext("2d").restore(), this.canvases.push(t)) } } , nn = new function() { var e = Math.min, t = Math.max, n = Math.abs, i, r, s, u, o, l, f, g, y, _, v; function b(E, A, N) { return .2989 * E + .587 * A + .114 * N } function T(E, A, N, D) { var R = D - b(E, A, N); y = E + R, _ = A + R, v = N + R; var D = b(y, _, v) , V = e(y, _, v) , z = t(y, _, v); if (V < 0) { var G = D - V; y = D + (y - D) * D / G, _ = D + (_ - D) * D / G, v = D + (v - D) * D / G } if (z > 255) { var H = 255 - D , K = z - D; y = D + (y - D) * H / K, _ = D + (_ - D) * H / K, v = D + (v - D) * H / K } } function x(E, A, N) { return t(E, A, N) - e(E, A, N) } function S(E, A, N, L) { var R = [E, A, N], D = t(E, A, N), V = e(E, A, N), z; V = V === E ? 0 : V === A ? 1 : 2, D = D === E ? 0 : D === A ? 1 : 2, z = e(V, D) === 0 ? t(V, D) === 1 ? 2 : 1 : 0, R[D] > R[V] ? (R[z] = (R[z] - R[V]) * L / (R[D] - R[V]), R[D] = L) : R[z] = R[D] = 0, R[V] = 0, y = R[0], _ = R[1], v = R[2] } var I = { multiply: function() { y = o * i / 255, _ = l * r / 255, v = f * s / 255 }, screen: function() { y = o + i - o * i / 255, _ = l + r - l * r / 255, v = f + s - f * s / 255 }, overlay: function() { y = o < 128 ? 2 * o * i / 255 : 255 - 2 * (255 - o) * (255 - i) / 255, _ = l < 128 ? 2 * l * r / 255 : 255 - 2 * (255 - l) * (255 - r) / 255, v = f < 128 ? 2 * f * s / 255 : 255 - 2 * (255 - f) * (255 - s) / 255 }, "soft-light": function() { var E = i * o / 255; y = E + o * (255 - (255 - o) * (255 - i) / 255 - E) / 255, E = r * l / 255, _ = E + l * (255 - (255 - l) * (255 - r) / 255 - E) / 255, E = s * f / 255, v = E + f * (255 - (255 - f) * (255 - s) / 255 - E) / 255 }, "hard-light": function() { y = i < 128 ? 2 * i * o / 255 : 255 - 2 * (255 - i) * (255 - o) / 255, _ = r < 128 ? 2 * r * l / 255 : 255 - 2 * (255 - r) * (255 - l) / 255, v = s < 128 ? 2 * s * f / 255 : 255 - 2 * (255 - s) * (255 - f) / 255 }, "color-dodge": function() { y = o === 0 ? 0 : i === 255 ? 255 : e(255, 255 * o / (255 - i)), _ = l === 0 ? 0 : r === 255 ? 255 : e(255, 255 * l / (255 - r)), v = f === 0 ? 0 : s === 255 ? 255 : e(255, 255 * f / (255 - s)) }, "color-burn": function() { y = o === 255 ? 255 : i === 0 ? 0 : t(0, 255 - (255 - o) * 255 / i), _ = l === 255 ? 255 : r === 0 ? 0 : t(0, 255 - (255 - l) * 255 / r), v = f === 255 ? 255 : s === 0 ? 0 : t(0, 255 - (255 - f) * 255 / s) }, darken: function() { y = o < i ? o : i, _ = l < r ? l : r, v = f < s ? f : s }, lighten: function() { y = o > i ? o : i, _ = l > r ? l : r, v = f > s ? f : s }, difference: function() { y = o - i, y < 0 && (y = -y), _ = l - r, _ < 0 && (_ = -_), v = f - s, v < 0 && (v = -v) }, exclusion: function() { y = o + i * (255 - o - o) / 255, _ = l + r * (255 - l - l) / 255, v = f + s * (255 - f - f) / 255 }, hue: function() { S(i, r, s, x(o, l, f)), T(y, _, v, b(o, l, f)) }, saturation: function() { S(o, l, f, x(i, r, s)), T(y, _, v, b(o, l, f)) }, luminosity: function() { T(o, l, f, b(i, r, s)) }, color: function() { T(i, r, s, b(o, l, f)) }, add: function() { y = e(o + i, 255), _ = e(l + r, 255), v = e(f + s, 255) }, subtract: function() { y = t(o - i, 0), _ = t(l - r, 0), v = t(f - s, 0) }, average: function() { y = (o + i) / 2, _ = (l + r) / 2, v = (f + s) / 2 }, negation: function() { y = 255 - n(255 - i - o), _ = 255 - n(255 - r - l), v = 255 - n(255 - s - f) } } , m = this.nativeModes = d.each(["source-over", "source-in", "source-out", "source-atop", "destination-over", "destination-in", "destination-out", "destination-atop", "lighter", "darker", "copy", "xor"], function(E) { this[E] = !0 }, {}) , w = Je.getContext(1, 1, { willReadFrequently: !0 }); w && (d.each(I, function(E, A) { var N = A === "darken" , L = !1; w.save(); try { w.fillStyle = N ? "#300" : "#a00", w.fillRect(0, 0, 1, 1), w.globalCompositeOperation = A, w.globalCompositeOperation === A && (w.fillStyle = N ? "#a00" : "#300", w.fillRect(0, 0, 1, 1), L = w.getImageData(0, 0, 1, 1).data[0] !== N ? 170 : 51) } catch {} w.restore(), m[A] = L }), Je.release(w)), this.process = function(E, A, N, L, R) { var D = A.canvas , V = E === "normal"; if (V || m[E]) N.save(), N.setTransform(1, 0, 0, 1, 0, 0), N.globalAlpha = L, V || (N.globalCompositeOperation = E), N.drawImage(D, R.x, R.y), N.restore(); else { var z = I[E]; if (!z) return; for (var G = N.getImageData(R.x, R.y, D.width, D.height), H = G.data, K = A.getImageData(0, 0, D.width, D.height).data, $ = 0, W = H.length; $ < W; $ += 4) { i = K[$], o = H[$], r = K[$ + 1], l = H[$ + 1], s = K[$ + 2], f = H[$ + 2], u = K[$ + 3], g = H[$ + 3], z(); var te = u * L / 255 , se = 1 - te; H[$] = te * y + se * o, H[$ + 1] = te * _ + se * l, H[$ + 2] = te * v + se * f, H[$ + 3] = u * L + se * g } N.putImageData(G, R.x, R.y) } } } , Qe = new function() { var e = "http://www.w3.org/2000/svg" , t = "http://www.w3.org/2000/xmlns" , n = "http://www.w3.org/1999/xlink" , i = { href: n, xlink: t, xmlns: t + "/", "xmlns:xlink": t + "/" }; function r(o, l, f) { return u(p.createElementNS(e, o), l, f) } function s(o, l) { var f = i[l] , g = f ? o.getAttributeNS(f, l) : o.getAttribute(l); return g === "null" ? null : g } function u(o, l, f) { for (var g in l) { var y = l[g] , _ = i[g]; typeof y == "number" && f && (y = f.number(y)), _ ? o.setAttributeNS(_, g, y) : o.setAttribute(g, y) } return o } return { svg: e, xmlns: t, xlink: n, create: r, get: s, set: u } } , En = d.each({ fillColor: ["fill", "color"], fillRule: ["fill-rule", "string"], strokeColor: ["stroke", "color"], strokeWidth: ["stroke-width", "number"], strokeCap: ["stroke-linecap", "string"], strokeJoin: ["stroke-linejoin", "string"], strokeScaling: ["vector-effect", "lookup", { true: "none", false: "non-scaling-stroke" }, function(e, t) { return !t && (e instanceof Ft || e instanceof je || e instanceof Gt) } ], miterLimit: ["stroke-miterlimit", "number"], dashArray: ["stroke-dasharray", "array"], dashOffset: ["stroke-dashoffset", "number"], fontFamily: ["font-family", "string"], fontWeight: ["font-weight", "string"], fontSize: ["font-size", "number"], justification: ["text-anchor", "lookup", { left: "start", center: "middle", right: "end" }], opacity: ["opacity", "number"], blendMode: ["mix-blend-mode", "style"] }, function(e, t) { var n = d.capitalize(t) , i = e[2]; this[t] = { type: e[1], property: t, attribute: e[0], toSVG: i, fromSVG: i && d.each(i, function(r, s) { this[r] = s }, {}), exportFilter: e[3], get: "get" + n, set: "set" + n } }, {}); new function() { var e; function t(I, m, w) { var E = new d , A = I.getTranslation(); if (m) { var N; I.isInvertible() ? (I = I._shiftless(), N = I._inverseTransform(A), A = null) : N = new C, E[w ? "cx" : "x"] = N.x, E[w ? "cy" : "y"] = N.y } if (!I.isIdentity()) { var L = I.decompose(); if (L) { var R = [] , D = L.rotation , V = L.scaling , z = L.skewing; A && !A.isZero() && R.push("translate(" + e.point(A) + ")"), D && R.push("rotate(" + e.number(D) + ")"), (!O.isZero(V.x - 1) || !O.isZero(V.y - 1)) && R.push("scale(" + e.point(V) + ")"), z.x && R.push("skewX(" + e.number(z.x) + ")"), z.y && R.push("skewY(" + e.number(z.y) + ")"), E.transform = R.join(" ") } else E.transform = "matrix(" + I.getValues().join(",") + ")" } return E } function n(I, m) { for (var w = t(I._matrix), E = I._children, A = Qe.create("g", w, e), N = 0, L = E.length; N < L; N++) { var R = E[N] , D = x(R, m); if (D) if (R.isClipMask()) { var V = Qe.create("clipPath"); V.appendChild(D), b(R, V, "clip"), Qe.set(A, { "clip-path": "url(#" + V.id + ")" }) } else A.appendChild(D) } return A } function i(I, m) { var w = t(I._matrix, !0) , E = I.getSize() , A = I.getImage(); return w.x -= E.width / 2, w.y -= E.height / 2, w.width = E.width, w.height = E.height, w.href = m.embedImages == !1 && A && A.src || I.toDataURL(), Qe.create("image", w, e) } function r(I, m) { var w = m.matchShapes; if (w) { var E = I.toShape(!1); if (E) return s(E, m) } var A = I._segments, N = A.length, L, R = t(I._matrix); if (w && N >= 2 && !I.hasHandles()) if (N > 2) { L = I._closed ? "polygon" : "polyline"; for (var D = [], V = 0; V < N; V++) D.push(e.point(A[V]._point)); R.points = D.join(" ") } else { L = "line"; var z = A[0]._point , G = A[1]._point; R.set({ x1: z.x, y1: z.y, x2: G.x, y2: G.y }) } else L = "path", R.d = I.getPathData(null, m.precision); return Qe.create(L, R, e) } function s(I) { var m = I._type , w = I._radius , E = t(I._matrix, !0, m !== "rectangle"); if (m === "rectangle") { m = "rect"; var A = I._size , N = A.width , L = A.height; E.x -= N / 2, E.y -= L / 2, E.width = N, E.height = L, w.isZero() && (w = null) } return w && (m === "circle" ? E.r = w : (E.rx = w.width, E.ry = w.height)), Qe.create(m, E, e) } function u(I, m) { var w = t(I._matrix) , E = I.getPathData(null, m.precision); return E && (w.d = E), Qe.create("path", w, e) } function o(I, m) { var w = t(I._matrix, !0) , E = I._definition , A = v(E, "symbol") , N = E._item , L = N.getStrokeBounds(); return A || (A = Qe.create("symbol", { viewBox: e.rectangle(L) }), A.appendChild(x(N, m)), b(E, A, "symbol")), w.href = "#" + A.id, w.x += L.x, w.y += L.y, w.width = L.width, w.height = L.height, w.overflow = "visible", Qe.create("use", w, e) } function l(I) { var m = v(I, "color"); if (!m) { var w = I.getGradient(), E = w._radial, A = I.getOrigin(), N = I.getDestination(), L; if (E) { L = { cx: A.x, cy: A.y, r: A.getDistance(N) }; var R = I.getHighlight(); R && (L.fx = R.x, L.fy = R.y) } else L = { x1: A.x, y1: A.y, x2: N.x, y2: N.y }; L.gradientUnits = "userSpaceOnUse", m = Qe.create((E ? "radial" : "linear") + "Gradient", L, e); for (var D = w._stops, V = 0, z = D.length; V < z; V++) { var G = D[V] , H = G._color , K = H.getAlpha() , $ = G._offset; L = { offset: $ ?? V / (z - 1) }, H && (L["stop-color"] = H.toCSS(!0)), K < 1 && (L["stop-opacity"] = K), m.appendChild(Qe.create("stop", L, e)) } b(I, m, "color") } return "url(#" + m.id + ")" } function f(I) { var m = Qe.create("text", t(I._matrix, !0), e); return m.textContent = I._content, m } var g = { Group: n, Layer: n, Raster: i, Path: r, Shape: s, CompoundPath: u, SymbolItem: o, PointText: f }; function y(I, m, w) { var E = {} , A = !w && I.getParent() , N = []; return I._name != null && (E.id = I._name), d.each(En, function(L) { var R = L.get , D = L.type , V = I[R](); if (L.exportFilter ? L.exportFilter(I, V) : !A || !d.equals(A[R](), V)) { if (D === "color" && V != null) { var z = V.getAlpha(); z < 1 && (E[L.attribute + "-opacity"] = z) } D === "style" ? N.push(L.attribute + ": " + V) : E[L.attribute] = V == null ? "none" : D === "color" ? V.gradient ? l(V, I) : V.toCSS(!0) : D === "array" ? V.join(",") : D === "lookup" ? L.toSVG[V] : V } }), N.length && (E.style = N.join(";")), E.opacity === 1 && delete E.opacity, I._visible || (E.visibility = "hidden"), Qe.set(m, E, e) } var _; function v(I, m) { return _ || (_ = { ids: {}, svgs: {} }), I && _.svgs[m + "-" + (I._id || I.__id || (I.__id = B.get("svg")))] } function b(I, m, w) { _ || v(); var E = _.ids[w] = (_.ids[w] || 0) + 1; m.id = w + "-" + E, _.svgs[w + "-" + (I._id || I.__id)] = m } function T(I, m) { var w = I , E = null; if (_) { w = I.nodeName.toLowerCase() === "svg" && I; for (var A in _.svgs) E || (w || (w = Qe.create("svg"), w.appendChild(I)), E = w.insertBefore(Qe.create("defs"), w.firstChild)), E.appendChild(_.svgs[A]); _ = null } return m.asString ? new c.XMLSerializer().serializeToString(w) : w } function x(I, m, w) { var E = g[I._class] , A = E && E(I, m); if (A) { var N = m.onExport; N && (A = N(I, A, m) || A); var L = JSON.stringify(I._data); L && L !== "{}" && L !== "null" && A.setAttribute("data-paper-data", L) } return A && y(I, A, w) } function S(I) { return I || (I = {}), e = new k(I.precision), I } oe.inject({ exportSVG: function(I) { return I = S(I), T(x(this, I, !0), I) } }), ye.inject({ exportSVG: function(I) { I = S(I); var m = this._children , w = this.getView() , E = d.pick(I.bounds, "view") , A = I.matrix || E === "view" && w._matrix , N = A && le.read([A]) , L = E === "view" ? new Y([0, 0],w.getViewSize()) : E === "content" ? oe._getBounds(m, N, { stroke: !0 }).rect : Y.read([E], 0, { readNull: !0 }) , R = { version: "1.1", xmlns: Qe.svg, "xmlns:xlink": Qe.xlink }; L && (R.width = L.width, R.height = L.height, (L.x || L.x === 0 || L.y || L.y === 0) && (R.viewBox = e.rectangle(L))); var D = Qe.create("svg", R, e) , V = D; N && !N.isIdentity() && (V = D.appendChild(Qe.create("g", t(N), e))); for (var z = 0, G = m.length; z < G; z++) V.appendChild(x(m[z], I, !0)); return T(D, I) } }) } , new function() { var e = {}, t; function n(m, w, E, A, N, L) { var R = Qe.get(m, w) || L , D = R == null ? A ? null : E ? "" : 0 : E ? R : parseFloat(R); return /%\s*$/.test(R) ? D / 100 * (N ? 1 : t[/x|^width/.test(w) ? "width" : "height"]) : D } function i(m, w, E, A, N, L, R) { return w = n(m, w || "x", !1, A, N, L), E = n(m, E || "y", !1, A, N, R), A && (w == null || E == null) ? null : new C(w,E) } function r(m, w, E, A, N) { return w = n(m, w || "width", !1, A, N), E = n(m, E || "height", !1, A, N), A && (w == null || E == null) ? null : new J(w,E) } function s(m, w, E) { return m === "none" ? null : w === "number" ? parseFloat(m) : w === "array" ? m ? m.split(/[\s,]+/g).map(parseFloat) : [] : w === "color" ? x(m) || m : w === "lookup" ? E[m] : m } function u(m, w, E, A) { var N = m.childNodes , L = w === "clippath" , R = w === "defs" , D = new We , V = D._project , z = V._currentStyle , G = []; if (!L && !R && (D = T(D, m, A), V._currentStyle = D._style.clone()), A) for (var H = m.querySelectorAll("defs"), K = 0, $ = H.length; K < $; K++) S(H[K], E, !1); for (var K = 0, $ = N.length; K < $; K++) { var W = N[K], te; W.nodeType === 1 && !/^defs$/i.test(W.nodeName) && (te = S(W, E, !1)) && !(te instanceof dt) && G.push(te) } return D.addChildren(G), L && (D = T(D.reduce(), m, A)), V._currentStyle = z, (L || R) && (D.remove(), D = null), D } function o(m, w) { for (var E = m.getAttribute("points").match(/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g), A = [], N = 0, L = E.length; N < L; N += 2) A.push(new C(parseFloat(E[N]),parseFloat(E[N + 1]))); var R = new ke(A); return w === "polygon" && R.closePath(), R } function l(m) { return Ft.create(m.getAttribute("d")) } function f(m, w) { var E = (n(m, "href", !0) || "").substring(1), A = w === "radialgradient", N; if (E) N = e[E].getGradient(), N._radial ^ A && (N = N.clone(), N._radial = A); else { for (var L = m.childNodes, R = [], D = 0, V = L.length; D < V; D++) { var z = L[D]; z.nodeType === 1 && R.push(T(new en, z)) } N = new xt(R,A) } var G, H, K, $ = n(m, "gradientUnits", !0) !== "userSpaceOnUse"; A ? (G = i(m, "cx", "cy", !1, $, "50%", "50%"), H = G.add(n(m, "r", !1, !1, $, "50%"), 0), K = i(m, "fx", "fy", !0, $)) : (G = i(m, "x1", "y1", !1, $, "0%", "0%"), H = i(m, "x2", "y2", !1, $, "100%", "0%")); var W = T(new Xe(N,G,H,K), m); return W._scaleToBounds = $, null } var g = { "#document": function(m, w, E, A) { for (var N = m.childNodes, L = 0, R = N.length; L < R; L++) { var D = N[L]; if (D.nodeType === 1) return S(D, E, A) } }, g: u, svg: u, clippath: u, polygon: o, polyline: o, path: l, lineargradient: f, radialgradient: f, image: function(m) { var w = new Pt(n(m, "href", !0)); return w.on("load", function() { var E = r(m); this.setSize(E); var A = i(m).add(E.divide(2)); this._matrix.append(new le().translate(A)) }), w }, symbol: function(m, w, E, A) { return new dt(u(m, w, E, A),!0) }, defs: u, use: function(m) { var w = (n(m, "href", !0) || "").substring(1) , E = e[w] , A = i(m); return E ? E instanceof dt ? E.place(A) : E.clone().translate(A) : null }, circle: function(m) { return new je.Circle(i(m, "cx", "cy"),n(m, "r")) }, ellipse: function(m) { return new je.Ellipse({ center: i(m, "cx", "cy"), radius: r(m, "rx", "ry") }) }, rect: function(m) { return new je.Rectangle(new Y(i(m),r(m)),r(m, "rx", "ry")) }, line: function(m) { return new ke.Line(i(m, "x1", "y1"),i(m, "x2", "y2")) }, text: function(m) { var w = new Mt(i(m).add(i(m, "dx", "dy"))); return w.setContent(m.textContent.trim() || ""), w }, switch: u }; function y(m, w, E, A) { if (m.transform) { for (var N = (A.getAttribute(E) || "").split(/\)\s*/g), L = new le, R = 0, D = N.length; R < D; R++) { var V = N[R]; if (!V) break; for (var z = V.split(/\(\s*/), G = z[0], H = z[1].split(/[\s,]+/g), K = 0, $ = H.length; K < $; K++) H[K] = parseFloat(H[K]); switch (G) { case "matrix": L.append(new le(H[0],H[1],H[2],H[3],H[4],H[5])); break; case "rotate": L.rotate(H[0], H[1] || 0, H[2] || 0); break; case "translate": L.translate(H[0], H[1] || 0); break; case "scale": L.scale(H); break; case "skewX": L.skew(H[0], 0); break; case "skewY": L.skew(0, H[0]); break } } m.transform(L) } } function _(m, w, E) { var A = E === "fill-opacity" ? "getFillColor" : "getStrokeColor" , N = m[A] && m[A](); N && N.setAlpha(parseFloat(w)) } var v = d.set(d.each(En, function(m) { this[m.attribute] = function(w, E) { if (w[m.set] && (w[m.set](s(E, m.type, m.fromSVG)), m.type === "color")) { var A = w[m.get](); if (A && A._scaleToBounds) { var N = w.getBounds(); A.transform(new le().translate(N.getPoint()).scale(N.getSize())) } } } }, {}), { id: function(m, w) { e[w] = m, m.setName && m.setName(w) }, "clip-path": function(m, w) { var E = x(w); if (E) if (E = E.clone(), E.setClipMask(!0), m instanceof We) m.insertChild(0, E); else return new We(E,m) }, gradientTransform: y, transform: y, "fill-opacity": _, "stroke-opacity": _, visibility: function(m, w) { m.setVisible && m.setVisible(w === "visible") }, display: function(m, w) { m.setVisible && m.setVisible(w !== null) }, "stop-color": function(m, w) { m.setColor && m.setColor(w) }, "stop-opacity": function(m, w) { m._color && m._color.setAlpha(parseFloat(w)) }, offset: function(m, w) { if (m.setOffset) { var E = w.match(/(.*)%$/); m.setOffset(E ? E[1] / 100 : parseFloat(w)) } }, viewBox: function(m, w, E, A, N) { var L = new Y(s(w, "array")), R = r(A, null, null, !0), D, V; if (m instanceof We) { var z = R ? R.divide(L.getSize()) : 1 , V = new le().scale(z).translate(L.getPoint().negate()); D = m } else m instanceof dt && (R && L.setSize(R), D = m._item); if (D) { if (b(A, "overflow", N) !== "visible") { var G = new je.Rectangle(L); G.setClipMask(!0), D.addChild(G) } V && D.transform(V) } } }); function b(m, w, E) { var A = m.attributes[w] , N = A && A.value; if (!N && m.style) { var L = d.camelize(w); N = m.style[L], !N && E.node[L] !== E.parent[L] && (N = E.node[L]) } return N ? N === "none" ? null : N : a } function T(m, w, E) { var A = w.parentNode , N = { node: Ce.getStyles(w) || {}, parent: !E && !/^defs$/i.test(A.tagName) && Ce.getStyles(A) || {} }; return d.each(v, function(L, R) { var D = b(w, R, N); m = D !== a && L(m, D, R, w, N) || m }), m } function x(m) { var w = m && m.match(/\((?:["'#]*)([^"')]+)/) , E = w && w[1] , A = E && e[h ? E.replace(h.location.href.split("#")[0] + "#", "") : E]; return A && A._scaleToBounds && (A = A.clone(), A._scaleToBounds = !0), A } function S(m, w, E) { var A = m.nodeName.toLowerCase(), N = A !== "#document", L = p.body, R, D, V; E && N && (t = ae.getView().getSize(), t = r(m, null, null, !0) || t, R = Qe.create("svg", { style: "stroke-width: 1px; stroke-miterlimit: 10" }), D = m.parentNode, V = m.nextSibling, R.appendChild(m), L.appendChild(R)); var z = ae.settings , G = z.applyMatrix , H = z.insertItems; z.applyMatrix = !1, z.insertItems = !1; var K = g[A] , $ = K && K(m, A, w, E) || null; if (z.insertItems = H, z.applyMatrix = G, $) { N && !($ instanceof We) && ($ = T($, m, E)); var W = w.onImport , te = N && m.getAttribute("data-paper-data"); W && ($ = W(m, $, w) || $), w.expandShapes && $ instanceof je && ($.remove(), $ = $.toPath()), te && ($._data = JSON.parse(te)) } return R && (L.removeChild(R), D && (V ? D.insertBefore(m, V) : D.appendChild(m))), E && (e = {}, $ && d.pick(w.applyMatrix, G) && $.matrix.apply(!0, !0)), $ } function I(m, w, E) { if (!m) return null; w = typeof w == "function" ? { onLoad: w } : w || {}; var A = ae , N = null; function L(z) { try { var G = typeof z == "object" ? z : new c.DOMParser().parseFromString(z.trim(), "image/svg+xml"); if (!G.nodeName) throw G = null, new Error("Unsupported SVG source: " + m); ae = A, N = S(G, w, !0), (!w || w.insert !== !1) && E._insertItem(a, N); var H = w.onLoad; H && H(N, z) } catch (K) { R(K) } } function R(z, G) { var H = w.onError; if (H) H(z, G); else throw new Error(z) } if (typeof m == "string" && !/^[\s\S]* d[0] && O[1] < d[3])) { M.label = O[1]; break } if (O[0] === 6 && M.label < d[1]) { M.label = d[1], d = O; break } if (d && M.label < d[2]) { M.label = d[2], M.ops.push(O); break } d[2] && M.ops.pop(), M.trys.pop(); continue } O = a.call(c, M) } catch (B) { O = [6, B], p = 0 } finally { h = d = 0 } if (5 & O[0]) throw O[1]; return { value: O[0] ? O[1] : void 0, done: !0 } }([q, k]) } } } function lt(c) { var a = typeof Symbol == "function" && Symbol.iterator , h = a && c[a] , p = 0; if (h) return h.call(c); if (c && typeof c.length == "number") return { next: function() { return { value: (c = c && p >= c.length ? void 0 : c) && c[p++], done: !c } } }; throw new TypeError(a ? "Object is not iterable." : "Symbol.iterator is not defined.") } function It(c, a) { var h = typeof Symbol == "function" && c[Symbol.iterator]; if (!h) return c; var p, d, M = h.call(c), F = []; try { for (; (a === void 0 || 0 < a--) && !(p = M.next()).done; ) F.push(p.value) } catch (Z) { d = { error: Z } } finally { try { p && !p.done && (h = M.return) && h.call(M) } finally { if (d) throw d.error } } return F } function Tt(c, a) { for (var h = 0, p = a.length, d = c.length; h < p; h++, d++) c[d] = a[h]; return c } (function(c) { c.assertNever = function(a) { throw new Error } , c.arrayToEnum = function(a) { var h, p, d = {}; try { for (var M = lt(a), F = M.next(); !F.done; F = M.next()) { var Z = F.value; d[Z] = Z } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d } , c.getValidEnumValues = function(a) { var h, p, d = c.objectKeys(a).filter(function(k) { return typeof a[a[k]] != "number" }), M = {}; try { for (var F = lt(d), Z = F.next(); !Z.done; Z = F.next()) { var q = Z.value; M[q] = a[q] } } catch (k) { h = { error: k } } finally { try { Z && !Z.done && (p = F.return) && p.call(F) } finally { if (h) throw h.error } } return c.objectValues(M) } , c.objectValues = function(a) { return c.objectKeys(a).map(function(h) { return a[h] }) } , c.objectKeys = typeof Object.keys == "function" ? function(a) { return Object.keys(a) } : function(a) { var h, p = []; for (h in a) Object.prototype.hasOwnProperty.call(a, h) && p.push(h); return p } , c.find = function(a, h) { var p, d; try { for (var M = lt(a), F = M.next(); !F.done; F = M.next()) { var Z = F.value; if (h(Z)) return Z } } catch (q) { p = { error: q } } finally { try { F && !F.done && (d = M.return) && d.call(M) } finally { if (p) throw p.error } } } , c.isInteger = typeof Number.isInteger == "function" ? function(a) { return Number.isInteger(a) } : function(a) { return typeof a == "number" && isFinite(a) && Math.floor(a) === a } } )(rt = rt || {}); var et, be = rt.arrayToEnum(["invalid_type", "custom", "invalid_union", "invalid_enum_value", "unrecognized_keys", "invalid_arguments", "invalid_return_type", "invalid_date", "invalid_string", "too_small", "too_big", "invalid_intersection_types", "not_multiple_of"]), Ta = function(c) { return JSON.stringify(c, null, 2).replace(/"([^"]+)":/g, "$1:") }, On = function(c) { function a(h) { var p = this.constructor , d = c.call(this) || this; return d.issues = [], d.format = function() { var M = { _errors: [] } , F = function(Z) { var q, k; try { for (var O = lt(Z.issues), B = O.next(); !B.done; B = O.next()) { var C = B.value; if (C.code === "invalid_union") C.unionErrors.map(F); else if (C.code === "invalid_return_type") F(C.returnTypeError); else if (C.code === "invalid_arguments") F(C.argumentsError); else if (C.path.length === 0) M._errors.push(C.message); else for (var Q = M, J = 0; J < C.path.length; ) { var ne, Y = C.path[J]; J === C.path.length - 1 ? (Q[Y] = Q[Y] || { _errors: [] }, Q[Y]._errors.push(C.message)) : typeof Y == "string" ? Q[Y] = Q[Y] || { _errors: [] } : typeof Y == "number" && ((ne = [])._errors = [], Q[Y] = Q[Y] || ne), Q = Q[Y], J++ } } } catch (Me) { q = { error: Me } } finally { try { B && !B.done && (k = O.return) && k.call(O) } finally { if (q) throw q.error } } }; return F(d), M } , d.addIssue = function(M) { d.issues = Tt(Tt([], It(d.issues), !1), [M]) } , d.addIssues = function(M) { M === void 0 && (M = []), d.issues = Tt(Tt([], It(d.issues), !1), It(M)) } , d.flatten = function(M) { var F, Z; M === void 0 && (M = function(Q) { return Q.message } ); var q = {} , k = []; try { for (var O = lt(d.issues), B = O.next(); !B.done; B = O.next()) { var C = B.value; 0 < C.path.length ? (q[C.path[0]] = q[C.path[0]] || [], q[C.path[0]].push(M(C))) : k.push(M(C)) } } catch (Q) { F = { error: Q } } finally { try { B && !B.done && (Z = O.return) && Z.call(O) } finally { if (F) throw F.error } } return { formErrors: k, fieldErrors: q } } , p = p.prototype, Object.setPrototypeOf ? Object.setPrototypeOf(d, p) : d.__proto__ = p, d.name = "ZodError", d.issues = h, d } return He(a, c), Object.defineProperty(a.prototype, "errors", { get: function() { return this.issues }, enumerable: !1, configurable: !0 }), a.prototype.toString = function() { return this.message } , Object.defineProperty(a.prototype, "message", { get: function() { return JSON.stringify(this.issues, null, 2) }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "isEmpty", { get: function() { return this.issues.length === 0 }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "formErrors", { get: function() { return this.flatten() }, enumerable: !1, configurable: !0 }), a.create = function(h) { return new a(h) } , a }(Error), ji = function(c, a) { var h; switch (c.code) { case be.invalid_type: h = c.received === "undefined" ? "Required" : "Expected " + c.expected + ", received " + c.received; break; case be.unrecognized_keys: h = "Unrecognized key(s) in object: " + c.keys.map(function(p) { return "'" + p + "'" }).join(", "); break; case be.invalid_union: h = "Invalid input"; break; case be.invalid_enum_value: h = "Invalid enum value. Expected " + c.options.map(function(p) { return typeof p == "string" ? "'" + p + "'" : p }).join(" | ") + ", received " + (typeof a.data == "string" ? "'" + a.data + "'" : a.data); break; case be.invalid_arguments: h = "Invalid function arguments"; break; case be.invalid_return_type: h = "Invalid function return type"; break; case be.invalid_date: h = "Invalid date"; break; case be.invalid_string: h = c.validation !== "regex" ? "Invalid " + c.validation : "Invalid"; break; case be.too_small: h = c.type === "array" ? "Should have " + (c.inclusive ? "at least" : "more than") + " " + c.minimum + " items" : c.type === "string" ? "Should be " + (c.inclusive ? "at least" : "over") + " " + c.minimum + " characters" : c.type === "number" ? "Value should be greater than " + (c.inclusive ? "or equal to " : "") + c.minimum : "Invalid input"; break; case be.too_big: h = c.type === "array" ? "Should have " + (c.inclusive ? "at most" : "less than") + " " + c.maximum + " items" : c.type === "string" ? "Should be " + (c.inclusive ? "at most" : "under") + " " + c.maximum + " characters long" : c.type === "number" ? "Value should be less than " + (c.inclusive ? "or equal to " : "") + c.maximum : "Invalid input"; break; case be.custom: h = "Invalid input"; break; case be.invalid_intersection_types: h = "Intersection results could not be merged"; break; case be.not_multiple_of: h = "Should be multiple of " + c.multipleOf; break; default: h = a.defaultError, rt.assertNever(c) } return { message: h } }, qi = ji, Ia = function(c) { qi = c }, we = rt.arrayToEnum(["string", "nan", "number", "integer", "float", "boolean", "date", "bigint", "symbol", "function", "undefined", "null", "array", "object", "unknown", "promise", "void", "never", "map", "set"]), wt = function(c) { switch (typeof c) { case "undefined": return we.undefined; case "string": return we.string; case "number": return isNaN(c) ? we.nan : we.number; case "boolean": return we.boolean; case "function": return we.function; case "bigint": return we.bigint; case "object": return Array.isArray(c) ? we.array : c === null ? we.null : c.then && typeof c.then == "function" && c.catch && typeof c.catch == "function" ? we.promise : c instanceof Map ? we.map : c instanceof Set ? we.set : c instanceof Date ? we.date : we.object; default: return we.unknown } }, ui = function(d) { var a, h, p = d.data, M = d.path, q = d.errorMaps, d = d.issueData, M = Tt(Tt([], It(M), !1), It(d.path || [])), F = ee(ee({}, d), { path: M }), Z = "", q = q.filter(function(B) { return !!B }).slice().reverse(); try { for (var k = lt(q), O = k.next(); !O.done; O = k.next()) Z = (0, O.value)(F, { data: p, defaultError: Z }).message } catch (B) { a = { error: B } } finally { try { O && !O.done && (h = k.return) && h.call(k) } finally { if (a) throw a.error } } return ee(ee({}, d), { path: M, message: d.message || Z }) }, Ca = null, Nn = function(c) { if (c === null) return []; for (var a = new Array(c.count); c !== null; ) a[c.count - 1] = c.component, c = c.parent; return a }, Ar = function(c) { for (var a = null, h = 0; h < c.length; h++) a = { parent: a, component: c[h], count: h + 1 }; return a }, li = function() { function c(a) { this.def = a } return Object.defineProperty(c.prototype, "path", { get: function() { return this.def.path }, enumerable: !1, configurable: !0 }), Object.defineProperty(c.prototype, "issues", { get: function() { return this.def.issues }, enumerable: !1, configurable: !0 }), Object.defineProperty(c.prototype, "errorMap", { get: function() { return this.def.errorMap }, enumerable: !1, configurable: !0 }), Object.defineProperty(c.prototype, "async", { get: function() { return this.def.async }, enumerable: !1, configurable: !0 }), c.prototype.stepInto = function(a) { return new c(ee(ee({}, this.def), { path: this.path === null ? { parent: null, count: 1, component: a } : { parent: this.path, count: this.path.count + 1, component: a } })) } , c.prototype._addIssue = function(a, h, p) { p === void 0 && (p = {}), p = ui({ data: a, issueData: h, path: Nn(this.path), errorMaps: [this.def.errorMap, p.schemaErrorMap, qi, ji] }), this.issues.push(p) } , c }(), Pe = Object.freeze({ valid: !1 }), Ue = function(c) { return { valid: !0, value: c } }, Lt = function(c) { return c.valid === !1 }, Qt = function(c) { return c.valid === !0 }, vn = function(c) { return c instanceof Promise }; (function(c) { c.errToObj = function(a) { return typeof a == "string" ? { message: a } : a || {} } , c.toString = function(a) { return typeof a == "string" ? a : a?.message } } )(et = et || {}); var wr = function(c) { return new li({ path: Ar(c.path || []), issues: [], errorMap: c.errorMap, async: (c = c.async) !== null && c !== void 0 && c }) } , br = function(c, a) { return Qt(a) && !c.issues.length ? { success: !0, data: a.value } : { success: !1, error: new On(c.issues) } }; function Ve(c) { if (!c) return {}; if (c.errorMap && (c.invalid_type_error || c.required_error)) throw new Error(`Can't use "invalid" or "required" in conjunction with custom error map.`); return c.errorMap ? { errorMap: c.errorMap } : { errorMap: function(a, h) { return a.code !== "invalid_type" ? { message: h.defaultError } : h.data === void 0 && c.required_error ? { message: c.required_error } : c.invalid_type_error ? { message: c.invalid_type_error } : { message: h.defaultError } } } } var Vn, Fe = function() { function c(a) { this.spa = this.safeParseAsync, this.superRefine = this._refinement, this._def = a, this.transform = this.transform.bind(this), this.default = this.default.bind(this) } return c.prototype.addIssue = function(a, h, p) { a._addIssue(p.data, h, { schemaErrorMap: this._def.errorMap }) } , c.prototype._parseSync = function(a, h, p) { if (p = this._parse(a, h, p), vn(p)) throw new Error("Synchronous parse encountered promise."); return p } , c.prototype._parseAsync = function(a, h, p) { return p = this._parse(a, h, p), Promise.resolve(p) } , c.prototype.parse = function(a, h) { if (h = this.safeParse(a, h), h.success) return h.data; throw h.error } , c.prototype.safeParse = function(a, h) { return h = wr(ee(ee({}, h), { async: !1 })), a = this._parseSync(h, a, wt(a)), br(h, a) } , c.prototype.parseAsync = function(a, h) { return Bi(this, void 0, void 0, function() { var p; return Ui(this, function(d) { switch (d.label) { case 0: return [4, this.safeParseAsync(a, h)]; case 1: if ((p = d.sent()).success) return [2, p.data]; throw p.error } }) }) } , c.prototype.safeParseAsync = function(a, h) { return Bi(this, void 0, void 0, function() { var p, d; return Ui(this, function(M) { switch (M.label) { case 0: return p = wr(ee(ee({}, h), { async: !0 })), d = this._parse(p, a, wt(a)), [4, vn(d) ? d : Promise.resolve(d)]; case 1: return d = M.sent(), [2, br(p, d)] } }) }) } , c.prototype.refine = function(a, h) { return this._refinement(function(p, d) { function M() { return d.addIssue(ee({ code: be.custom }, (Z = p, typeof h == "string" || h === void 0 ? { message: h } : typeof h == "function" ? h(Z) : h))); var Z } var F = a(p); return F instanceof Promise ? F.then(function(Z) { return !!Z || (M(), !1) }) : !!F || (M(), !1) }) } , c.prototype.refinement = function(a, h) { return this._refinement(function(p, d) { return !!a(p) || (d.addIssue(typeof h == "function" ? h(p, d) : h), !1) }) } , c.prototype._refinement = function(a) { return new Mn({ schema: this, typeName: Le.ZodEffects, effect: { type: "refinement", refinement: a } }) } , c.prototype.optional = function() { return on.create(this) } , c.prototype.nullable = function() { return Gn.create(this) } , c.prototype.nullish = function() { return this.optional().nullable() } , c.prototype.array = function() { return Fn.create(this) } , c.prototype.promise = function() { return _i.create(this) } , c.prototype.or = function(a) { return Yi.create([this, a]) } , c.prototype.and = function(a) { return pi.create(this, a) } , c.prototype.transform = function(a) { return new Mn({ schema: this, typeName: Le.ZodEffects, effect: { type: "transform", transform: a } }) } , c.prototype.default = function(a) { return new Gr({ innerType: this, defaultValue: typeof a == "function" ? a : function() { return a } , typeName: Le.ZodDefault }) } , c.prototype.isOptional = function() { return this.safeParse(void 0).success } , c.prototype.isNullable = function() { return this.safeParse(null).success } , c }(), Aa = /^c[^\s-]{8,}$/i, Pa = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i, Oa = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i, Ki = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h._regex = function(p, d, M) { return h.refinement(function(F) { return p.test(F) }, ee({ validation: d, code: be.invalid_string }, et.errToObj(M))) } , h.nonempty = function(p) { return h.min(1, et.errToObj(p)) } , h } return He(a, c), a.prototype._parse = function(h, p, d) { var M, F; if (d !== we.string) return this.addIssue(h, { code: be.invalid_type, expected: we.string, received: d }, { data: p }), Pe; var Z = !1; try { for (var q = lt(this._def.checks), k = q.next(); !k.done; k = q.next()) { var O = k.value; if (O.kind === "min") p.length < O.value && (Z = !0, this.addIssue(h, { code: be.too_small, minimum: O.value, type: "string", inclusive: !0, message: O.message }, { data: p })); else if (O.kind === "max") p.length > O.value && (Z = !0, this.addIssue(h, { code: be.too_big, maximum: O.value, type: "string", inclusive: !0, message: O.message }, { data: p })); else if (O.kind === "email") Oa.test(p) || (Z = !0, this.addIssue(h, { validation: "email", code: be.invalid_string, message: O.message }, { data: p })); else if (O.kind === "uuid") Pa.test(p) || (Z = !0, this.addIssue(h, { validation: "uuid", code: be.invalid_string, message: O.message }, { data: p })); else if (O.kind === "cuid") Aa.test(p) || (Z = !0, this.addIssue(h, { validation: "cuid", code: be.invalid_string, message: O.message }, { data: p })); else if (O.kind === "url") try { new URL(p) } catch { Z = !0, this.addIssue(h, { validation: "url", code: be.invalid_string, message: O.message }, { data: p }) } else O.kind === "regex" && (O.regex.lastIndex = 0, O.regex.test(p) || (Z = !0, this.addIssue(h, { validation: "regex", code: be.invalid_string, message: O.message }, { data: p }))) } } catch (B) { M = { error: B } } finally { try { k && !k.done && (F = q.return) && F.call(q) } finally { if (M) throw M.error } } return Z ? Pe : Ue(p) } , a.prototype._addCheck = function(h) { return new a(ee(ee({}, this._def), { checks: Tt(Tt([], It(this._def.checks), !1), [h]) })) } , a.prototype.email = function(h) { return this._addCheck(ee({ kind: "email" }, et.errToObj(h))) } , a.prototype.url = function(h) { return this._addCheck(ee({ kind: "url" }, et.errToObj(h))) } , a.prototype.uuid = function(h) { return this._addCheck(ee({ kind: "uuid" }, et.errToObj(h))) } , a.prototype.cuid = function(h) { return this._addCheck(ee({ kind: "cuid" }, et.errToObj(h))) } , a.prototype.regex = function(h, p) { return this._addCheck(ee({ kind: "regex", regex: h }, et.errToObj(p))) } , a.prototype.min = function(h, p) { return this._addCheck(ee({ kind: "min", value: h }, et.errToObj(p))) } , a.prototype.max = function(h, p) { return this._addCheck(ee({ kind: "max", value: h }, et.errToObj(p))) } , a.prototype.length = function(h, p) { return this.min(h, p).max(h, p) } , Object.defineProperty(a.prototype, "isEmail", { get: function() { return !!this._def.checks.find(function(h) { return h.kind === "email" }) }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "isURL", { get: function() { return !!this._def.checks.find(function(h) { return h.kind === "url" }) }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "isUUID", { get: function() { return !!this._def.checks.find(function(h) { return h.kind === "uuid" }) }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "isCUID", { get: function() { return !!this._def.checks.find(function(h) { return h.kind === "cuid" }) }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "minLength", { get: function() { var h = -1 / 0; return this._def.checks.map(function(p) { p.kind === "min" && (h === null || p.value > h) && (h = p.value) }), h }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "maxLength", { get: function() { var h = null; return this._def.checks.map(function(p) { p.kind === "max" && (h === null || p.value < h) && (h = p.value) }), h }, enumerable: !1, configurable: !0 }), a.create = function(h) { return new a(ee({ checks: [], typeName: Le.ZodString }, Ve(h))) } , a }(Fe), Pr = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h.min = h.gte, h.max = h.lte, h.step = h.multipleOf, h } return He(a, c), a.prototype._parse = function(h, p, d) { var M, F; if (d !== we.number) return this.addIssue(h, { code: be.invalid_type, expected: we.number, received: d }, { data: p }), Pe; var Z = !1; try { for (var q = lt(this._def.checks), k = q.next(); !k.done; k = q.next()) { var O = k.value; O.kind === "int" ? rt.isInteger(p) || (Z = !0, this.addIssue(h, { code: be.invalid_type, expected: "integer", received: "float", message: O.message }, { data: p })) : O.kind === "min" ? (O.inclusive ? p < O.value : p <= O.value) && (Z = !0, this.addIssue(h, { code: be.too_small, minimum: O.value, type: "number", inclusive: O.inclusive, message: O.message }, { data: p })) : O.kind === "max" ? (O.inclusive ? p > O.value : p >= O.value) && (Z = !0, this.addIssue(h, { code: be.too_big, maximum: O.value, type: "number", inclusive: O.inclusive, message: O.message }, { data: p })) : O.kind === "multipleOf" ? p % O.value != 0 && (Z = !0, this.addIssue(h, { code: be.not_multiple_of, multipleOf: O.value, message: O.message }, { data: p })) : rt.assertNever(O) } } catch (B) { M = { error: B } } finally { try { k && !k.done && (F = q.return) && F.call(q) } finally { if (M) throw M.error } } return Z ? Pe : Ue(p) } , a.prototype.gte = function(h, p) { return this.setLimit("min", h, !0, et.toString(p)) } , a.prototype.gt = function(h, p) { return this.setLimit("min", h, !1, et.toString(p)) } , a.prototype.lte = function(h, p) { return this.setLimit("max", h, !0, et.toString(p)) } , a.prototype.lt = function(h, p) { return this.setLimit("max", h, !1, et.toString(p)) } , a.prototype.setLimit = function(h, p, d, M) { return new a(ee(ee({}, this._def), { checks: Tt(Tt([], It(this._def.checks), !1), [{ kind: h, value: p, inclusive: d, message: et.toString(M) }]) })) } , a.prototype._addCheck = function(h) { return new a(ee(ee({}, this._def), { checks: Tt(Tt([], It(this._def.checks), !1), [h]) })) } , a.prototype.int = function(h) { return this._addCheck({ kind: "int", message: et.toString(h) }) } , a.prototype.positive = function(h) { return this._addCheck({ kind: "min", value: 0, inclusive: !1, message: et.toString(h) }) } , a.prototype.negative = function(h) { return this._addCheck({ kind: "max", value: 0, inclusive: !1, message: et.toString(h) }) } , a.prototype.nonpositive = function(h) { return this._addCheck({ kind: "max", value: 0, inclusive: !0, message: et.toString(h) }) } , a.prototype.nonnegative = function(h) { return this._addCheck({ kind: "min", value: 0, inclusive: !0, message: et.toString(h) }) } , a.prototype.multipleOf = function(h, p) { return this._addCheck({ kind: "multipleOf", value: h, message: et.toString(p) }) } , Object.defineProperty(a.prototype, "minValue", { get: function() { var h, p, d = null; try { for (var M = lt(this._def.checks), F = M.next(); !F.done; F = M.next()) { var Z = F.value; Z.kind === "min" && (d === null || Z.value > d) && (d = Z.value) } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "maxValue", { get: function() { var h, p, d = null; try { for (var M = lt(this._def.checks), F = M.next(); !F.done; F = M.next()) { var Z = F.value; Z.kind === "max" && (d === null || Z.value < d) && (d = Z.value) } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "isInt", { get: function() { return !!this._def.checks.find(function(h) { return h.kind === "int" }) }, enumerable: !1, configurable: !0 }), a.create = function(h) { return new a(ee(ee({ checks: [], typeName: Le.ZodNumber }, Ve(h)), Ve(h))) } , a }(Fe), Or = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.bigint ? (this.addIssue(h, { code: be.invalid_type, expected: we.bigint, received: d }, { data: p }), Pe) : Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodBigInt }, Ve(h))) } , a }(Fe), xr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.boolean ? (this.addIssue(h, { code: be.invalid_type, expected: we.boolean, received: d }, { data: p }), Pe) : Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodBoolean }, Ve(h))) } , a }(Fe), Nr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.date ? (this.addIssue(h, { code: be.invalid_type, expected: we.date, received: d }, { data: p }), Pe) : isNaN(p.getTime()) ? (this.addIssue(h, { code: be.invalid_date }, { data: p }), Pe) : Ue(new Date(p.getTime())) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodDate }, Ve(h))) } , a }(Fe), Lr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.undefined ? (this.addIssue(h, { code: be.invalid_type, expected: we.undefined, received: d }, { data: p }), Pe) : Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodUndefined }, Ve(h))) } , a }(Fe), Mr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.null ? (this.addIssue(h, { code: be.invalid_type, expected: we.null, received: d }, { data: p }), Pe) : Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodNull }, Ve(h))) } , a }(Fe), hi = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h._any = !0, h } return He(a, c), a.prototype._parse = function(h, p, d) { return Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodAny }, Ve(h))) } , a }(Fe), zn = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h._unknown = !0, h } return He(a, c), a.prototype._parse = function(h, p, d) { return Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodUnknown }, Ve(h))) } , a }(Fe), Pn = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return this.addIssue(h, { code: be.invalid_type, expected: we.never, received: d }, { data: p }), Pe } , a.create = function(h) { return new a(ee({ typeName: Le.ZodNever }, Ve(h))) } , a }(Fe), Rr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d !== we.undefined ? (this.addIssue(h, { code: be.invalid_type, expected: we.void, received: d }, { data: p }), Pe) : Ue(p) } , a.create = function(h) { return new a(ee({ typeName: Le.ZodVoid }, Ve(h))) } , a }(Fe), Fn = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, F, d) { var M = this._def; if (d !== we.array) return this.addIssue(h, { code: be.invalid_type, expected: we.array, received: d }, { data: F }), Pe; var F = F , Z = !1; M.minLength !== null && F.length < M.minLength.value && (Z = !0, this.addIssue(h, { code: be.too_small, minimum: M.minLength.value, type: "array", inclusive: !0, message: M.minLength.message }, { data: F })), M.maxLength !== null && F.length > M.maxLength.value && (Z = !0, this.addIssue(h, { code: be.too_big, maximum: M.maxLength.value, type: "array", inclusive: !0, message: M.maxLength.message }, { data: F })); var q = [] , k = new Array(F.length) , O = M.type , B = function(C, Q) { Qt(Q) ? k[C] = Q.value : Lt(Q) ? Z = !0 : q.push(Q.then(function(J) { return B(C, J) })) }; return F.forEach(function(C, Q) { B(Q, O._parse(h.stepInto(Q), C, wt(C))) }), h.async ? Promise.all(q).then(function() { return Z ? Pe : Ue(k) }) : Z ? Pe : Ue(k) } , Object.defineProperty(a.prototype, "element", { get: function() { return this._def.type }, enumerable: !1, configurable: !0 }), a.prototype.min = function(h, p) { return new a(ee(ee({}, this._def), { minLength: { value: h, message: et.toString(p) } })) } , a.prototype.max = function(h, p) { return new a(ee(ee({}, this._def), { maxLength: { value: h, message: et.toString(p) } })) } , a.prototype.length = function(h, p) { return this.min(h, p).max(h, p) } , a.prototype.nonempty = function(h) { return this.min(1, h) } , a.create = function(h, p) { return new a(ee({ type: h, minLength: null, maxLength: null, typeName: Le.ZodArray }, Ve(p))) } , a }(Fe); (function(c) { c.mergeShapes = function(a, h) { return ee(ee({}, a), h) } , c.intersectShapes = function(a, h) { var p, d, F = rt.objectKeys(a), M = rt.objectKeys(h), F = F.filter(function(B) { return M.indexOf(B) !== -1 }), Z = {}; try { for (var q = lt(F), k = q.next(); !k.done; k = q.next()) { var O = k.value; Z[O] = pi.create(a[O], h[O]) } } catch (B) { p = { error: B } } finally { try { k && !k.done && (d = q.return) && d.call(q) } finally { if (p) throw p.error } } return ee(ee(ee({}, a), h), Z) } } )(Vn = Vn || {}); var xa = function(c) { return function(a) { var h = Vn.mergeShapes(c._def.shape(), a._def.shape()); return new un({ unknownKeys: c._def.unknownKeys, catchall: c._def.catchall, shape: function() { return h }, typeName: Le.ZodObject }) } } , Sr = function(c) { return function(a) { return new un(ee(ee({}, c), { shape: function() { return ee(ee({}, c.shape()), a) } })) } }; function An(c) { if (c instanceof un) { var a, h = {}; for (a in c.shape) { var p = c.shape[a]; h[a] = on.create(An(p)) } return new un(ee(ee({}, c._def), { shape: function() { return h } })) } return c instanceof Fn ? Fn.create(An(c.element)) : c instanceof on ? on.create(An(c.unwrap())) : c instanceof Gn ? Gn.create(An(c.unwrap())) : c instanceof Ln ? Ln.create(c.items.map(function(d) { return An(d) })) : c } var un = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h._cached = null, h.nonstrict = h.passthrough, h.augment = Sr(h._def), h.extend = Sr(h._def), h } return He(a, c), a.prototype._getCached = function() { if (this._cached !== null) return this._cached; var h = this._def.shape() , p = rt.objectKeys(h); return this._cached = { shape: h, keys: p } } , a.prototype._parse = function(h, p, B) { var M, F, Z, q, k; if (B !== we.object) return this.addIssue(h, { code: be.invalid_type, expected: we.object, received: B }, { data: p }), Pe; var B = this._getCached() , O = B.shape , B = B.keys , C = !1 , Q = [] , J = {} , ne = function(qe, pe) { var Vt; Qt(pe) ? ((Vt = pe.value) !== void 0 || qe in p) && (J[qe] = Vt) : Lt(pe) ? C = !0 : Q.push(pe.then(function(re) { return ne(qe, re) })) }; try { for (var Y = lt(B), Me = Y.next(); !Me.done; Me = Y.next()) { var le = Me.value , Se = O[le] , ye = p[le]; ne(le, Se._parse(h.stepInto(le), ye, wt(ye))) } } catch (qe) { oe = { error: qe } } finally { try { Me && !Me.done && (M = Y.return) && M.call(Y) } finally { if (oe) throw oe.error } } if (this._def.catchall instanceof Pn) { var oe = this._def.unknownKeys; if (oe === "passthrough") { var We = rt.objectKeys(p).filter(function(qe) { return !(qe in O) }); try { for (var ct = lt(We), je = ct.next(); !je.done; je = ct.next()) le = je.value, J[le] = p[le] } catch (qe) { F = { error: qe } } finally { try { je && !je.done && (Z = ct.return) && Z.call(ct) } finally { if (F) throw F.error } } } else if (oe === "strict") 0 < (We = rt.objectKeys(p).filter(function(qe) { return !(qe in O) })).length && (C = !0, this.addIssue(h, { code: be.unrecognized_keys, keys: We }, { data: p })); else if (oe !== "strip") throw new Error("Internal ZodObject error: invalid unknownKeys value.") } else { var Pt = this._def.catchall , We = rt.objectKeys(p).filter(function(pe) { return !(pe in O) }); try { for (var ft = lt(We), dt = ft.next(); !dt.done; dt = ft.next()) le = dt.value, ye = p[le], ne(le, Pt._parse(h.stepInto(le), ye, wt(ye))) } catch (pe) { q = { error: pe } } finally { try { dt && !dt.done && (k = ft.return) && k.call(ft) } finally { if (q) throw q.error } } } return h.async ? Promise.all(Q).then(function() { return C ? Pe : Ue(J) }) : C ? Pe : Ue(J) } , Object.defineProperty(a.prototype, "shape", { get: function() { return this._def.shape() }, enumerable: !1, configurable: !0 }), a.prototype.strict = function() { return new a(ee(ee({}, this._def), { unknownKeys: "strict" })) } , a.prototype.strip = function() { return new a(ee(ee({}, this._def), { unknownKeys: "strip" })) } , a.prototype.passthrough = function() { return new a(ee(ee({}, this._def), { unknownKeys: "passthrough" })) } , a.prototype.setKey = function(h, p) { var d; return this.augment(((d = {})[h] = p, d)) } , a.prototype.merge = function(h) { var p = Vn.mergeShapes(this._def.shape(), h._def.shape()); return new a({ unknownKeys: h._def.unknownKeys, catchall: h._def.catchall, shape: function() { return p }, typeName: Le.ZodObject }) } , a.prototype.catchall = function(h) { return new a(ee(ee({}, this._def), { catchall: h })) } , a.prototype.pick = function(h) { var p = this , d = {}; return rt.objectKeys(h).map(function(M) { d[M] = p.shape[M] }), new a(ee(ee({}, this._def), { shape: function() { return d } })) } , a.prototype.omit = function(h) { var p = this , d = {}; return rt.objectKeys(this.shape).map(function(M) { rt.objectKeys(h).indexOf(M) === -1 && (d[M] = p.shape[M]) }), new a(ee(ee({}, this._def), { shape: function() { return d } })) } , a.prototype.deepPartial = function() { return An(this) } , a.prototype.partial = function(h) { var p, d = this, M = {}; if (h) return rt.objectKeys(this.shape).map(function(Z) { rt.objectKeys(h).indexOf(Z) === -1 ? M[Z] = d.shape[Z] : M[Z] = d.shape[Z].optional() }), new a(ee(ee({}, this._def), { shape: function() { return M } })); for (p in this.shape) { var F = this.shape[p]; M[p] = F.optional() } return new a(ee(ee({}, this._def), { shape: function() { return M } })) } , a.prototype.required = function() { var h, p = {}; for (h in this.shape) { for (var d = this.shape[h]; d instanceof on; ) d = d._def.innerType; p[h] = d } return new a(ee(ee({}, this._def), { shape: function() { return p } })) } , a.create = function(h, p) { return new a(ee({ shape: function() { return h }, unknownKeys: "strip", catchall: Pn.create(), typeName: Le.ZodObject }, Ve(p))) } , a.strictCreate = function(h, p) { return new a(ee({ shape: function() { return h }, unknownKeys: "strict", catchall: Pn.create(), typeName: Le.ZodObject }, Ve(p))) } , a.lazycreate = function(h, p) { return new a(ee({ shape: h, unknownKeys: "strip", catchall: Pn.create(), typeName: Le.ZodObject }, Ve(p))) } , a }(Fe) , Yi = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { function M(Me) { var le = Me.map(function(Se) { return new On(Se) }); return (Me = le.filter(function(Se) { return Se.issues[0].code !== "invalid_type" })).length === 1 ? Me[0].issues.forEach(function(Se) { return h.issues.push(Se) }) : q.addIssue(h, { code: be.invalid_union, unionErrors: le }, { data: p }), Pe } var F, Z, q = this, k = this._def.options; if (h.async) { var O = k.map(function() { return new li(ee(ee({}, h.def), { issues: [] })) }); return Promise.all(k.map(function(Me, le) { return Me._parse(O[le], p, d) })).then(function(Me) { var le, Se; try { for (var ye = lt(Me), oe = ye.next(); !oe.done; oe = ye.next()) { var We = oe.value; if (Qt(We)) return We } } catch (ct) { le = { error: ct } } finally { try { oe && !oe.done && (Se = ye.return) && Se.call(ye) } finally { if (le) throw le.error } } return M(O.map(function(ct) { return ct.issues })) }) } var B = []; try { for (var C = lt(k), Q = C.next(); !Q.done; Q = C.next()) { var J = Q.value , ne = new li(ee(ee({}, h.def), { issues: [] })) , Y = J._parseSync(ne, p, d); if (!Lt(Y)) return Y; B.push(ne.issues) } } catch (Me) { F = { error: Me } } finally { try { Q && !Q.done && (Z = C.return) && Z.call(C) } finally { if (F) throw F.error } } return M(B) } , Object.defineProperty(a.prototype, "options", { get: function() { return this._def.options }, enumerable: !1, configurable: !0 }), a.create = function(h, p) { return new a(ee({ options: h, typeName: Le.ZodUnion }, Ve(p))) } , a }(Fe); function zi(c, a) { var h, p, d = wt(c), M = wt(a); if (c === a) return { valid: !0, data: c }; if (d === we.object && M === we.object) { var F = rt.objectKeys(a) , Z = rt.objectKeys(c).filter(function(ne) { return F.indexOf(ne) !== -1 }) , q = ee(ee({}, c), a); try { for (var k = lt(Z), O = k.next(); !O.done; O = k.next()) { var B = O.value; if (!(C = zi(c[B], a[B])).valid) return { valid: !1 }; q[B] = C.data } } catch (ne) { h = { error: ne } } finally { try { O && !O.done && (p = k.return) && p.call(k) } finally { if (h) throw h.error } } return { valid: !0, data: q } } if (d !== we.array || M !== we.array) return { valid: !1 }; if (c.length !== a.length) return { valid: !1 }; for (var C, Q = [], J = 0; J < c.length; J++) { if (!(C = zi(c[J], a[J])).valid) return { valid: !1 }; Q.push(C.data) } return { valid: !0, data: Q } } var pi = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { function M(Z, q) { return Lt(Z) || Lt(q) ? Pe : (q = zi(Z.value, q.value)).valid ? Ue(q.data) : (F.addIssue(h, { code: be.invalid_intersection_types }, { data: p }), Pe) } var F = this; return h.async ? Promise.all([this._def.left._parse(h, p, d), this._def.right._parse(h, p, d)]).then(function(q) { var k = It(q, 2) , q = k[0] , k = k[1]; return M(q, k) }) : M(this._def.left._parseSync(h, p, d), this._def.right._parseSync(h, p, d)) } , a.create = function(h, p, d) { return new a(ee({ left: h, right: p, typeName: Le.ZodIntersection }, Ve(d))) } , a }(Fe) , Ln = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { if (d !== we.array) return this.addIssue(h, { code: be.invalid_type, expected: we.array, received: d }, { data: p }), Pe; var M = this._def.rest; if (!M && p.length > this._def.items.length) return this.addIssue(h, { code: be.too_big, maximum: this._def.items.length, inclusive: !0, type: "array" }, { data: p }), Pe; if (p.length < this._def.items.length) return this.addIssue(h, { code: be.too_small, minimum: this._def.items.length, inclusive: !0, type: "array" }, { data: p }), Pe; var F = [] , Z = this._def.items , q = new Array(p.length) , k = !1 , O = function(B, C) { Qt(C) ? q[B] = C.value : Lt(C) ? k = !0 : F.push(C.then(function(Q) { return O(B, Q) })) }; return Z.forEach(function(B, C) { O(C, B._parse(h.stepInto(C), p[C], wt(p[C]))) }), M && p.slice(Z.length).forEach(function(B, C) { C += Z.length, O(C, M._parse(h.stepInto(C), B, wt(B))) }), h.async ? Promise.all(F).then(function() { return k ? Pe : Ue(q) }) : k ? Pe : Ue(q) } , Object.defineProperty(a.prototype, "items", { get: function() { return this._def.items }, enumerable: !1, configurable: !0 }), a.prototype.rest = function(h) { return new a(ee(ee({}, this._def), { rest: h })) } , a.create = function(h, p) { return new a(ee({ items: h, typeName: Le.ZodTuple, rest: null }, Ve(p))) } , a }(Fe) , Dr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), Object.defineProperty(a.prototype, "keySchema", { get: function() { return this._def.keyType }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "valueSchema", { get: function() { return this._def.valueType }, enumerable: !1, configurable: !0 }), a.prototype._parse = function(h, p, d) { if (d !== we.object) return this.addIssue(h, { code: be.invalid_type, expected: we.object, received: d }, { data: p }), Pe; var M, F = [], Z = this._def.keyType, q = this._def.valueType, k = {}, O = !1, B = function(C, Q) { Qt(C) && Qt(Q) ? k[C.value] = Q.value : vn(C) || vn(Q) ? F.push(Promise.all([C, Q]).then(function(ne) { var Y = It(ne, 2) , ne = Y[0] , Y = Y[1]; return B(ne, Y) })) : O = !0 }; for (M in p) B(Z._parse(h.stepInto(M), M, wt(M)), q._parse(h.stepInto(M), p[M], wt(p[M]))); return h.async ? Promise.all(F).then(function() { return O ? Pe : Ue(k) }) : O ? Pe : Ue(k) } , Object.defineProperty(a.prototype, "element", { get: function() { return this._def.valueType }, enumerable: !1, configurable: !0 }), a.create = function(h, p, d) { return new a(p instanceof Fe ? ee({ keyType: h, valueType: p, typeName: Le.ZodRecord }, Ve(d)) : ee({ keyType: Ki.create(), valueType: h, typeName: Le.ZodRecord }, Ve(p))) } , a }(Fe) , kr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, Z, d) { if (d !== we.map) return this.addIssue(h, { code: be.invalid_type, expected: we.map, received: d }, { data: Z }), Pe; var M = this._def.keyType , F = this._def.valueType , Z = Z , q = new Map , k = [] , O = !1 , B = function(C, Q) { vn(C) || vn(Q) ? k.push(Promise.all([C, Q]).then(function(ne) { var Y = It(ne, 2) , ne = Y[0] , Y = Y[1]; return B(ne, Y) })) : Lt(C) || Lt(Q) ? O = !0 : q.set(C.value, Q.value) }; return Tt([], It(Z.entries())).forEach(function(ne, J) { var Y = It(ne, 2) , ne = Y[0] , Y = Y[1] , J = h.stepInto(J) , ne = M._parse(J.stepInto("key"), ne, wt(ne)) , Y = F._parse(J.stepInto("value"), Y, wt(Y)); B(ne, Y) }), h.async ? Promise.all(k).then(function() { return O ? Pe : Ue(q) }) : O ? Pe : Ue(q) } , a.create = function(h, p, d) { return new a(ee({ valueType: p, keyType: h, typeName: Le.ZodMap }, Ve(d))) } , a }(Fe) , Br = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, M, d) { if (d !== we.set) return this.addIssue(h, { code: be.invalid_type, expected: we.set, received: d }, { data: M }), Pe; var M = M , F = this._def.valueType , Z = new Set , q = [] , k = !1 , O = function(B) { Qt(B) ? Z.add(B.value) : Lt(B) ? k = !0 : q.push(B.then(function(C) { return O(C) })) }; return Tt([], It(M.values())).forEach(function(B, C) { return O(F._parse(h.stepInto(C), B, wt(B))) }), h.async ? Promise.all(q).then(function() { return k ? Pe : Ue(Z) }) : k ? Pe : Ue(Z) } , a.create = function(h, p) { return new a(ee({ valueType: h, typeName: Le.ZodSet }, Ve(p))) } , a }(Fe) , Ur = function(c) { function a() { var h = c !== null && c.apply(this, arguments) || this; return h.validate = h.implement, h } return He(a, c), a.prototype._parse = function(h, p, d) { var M = this; if (d !== we.function) return this.addIssue(h, { code: be.invalid_type, expected: we.function, received: d }, { data: p }), Pe; function F(O, B) { return ui({ data: O, path: Nn(h.path), errorMaps: [h.errorMap], issueData: { code: be.invalid_arguments, argumentsError: B } }) } function Z(O, B) { return ui({ data: O, path: Nn(h.path), errorMaps: [h.errorMap], issueData: { code: be.invalid_return_type, returnTypeError: B } }) } var q = { errorMap: h.errorMap } , k = p; return this._def.returns instanceof _i ? Ue(function() { for (var O = [], B = 0; B < arguments.length; B++) O[B] = arguments[B]; return Bi(M, void 0, void 0, function() { var C, Q, J; return Ui(this, function(ne) { switch (ne.label) { case 0: return C = new On([]), [4, this._def.args.parseAsync(O, q).catch(function(Y) { throw C.addIssue(F(O, Y)), C })]; case 1: return Q = ne.sent(), [4, k.apply(void 0, Tt([], It(Q)))]; case 2: return J = ne.sent(), [4, this._def.returns.parseAsync(J, q).catch(function(Y) { throw C.addIssue(Z(J, Y)), C })]; case 3: return [2, ne.sent()] } }) }) }) : Ue(function() { for (var O = [], B = 0; B < arguments.length; B++) O[B] = arguments[B]; var Q = M._def.args.safeParse(O, q); if (!Q.success) throw new On([F(O, Q.error)]); var C = k.apply(void 0, Tt([], It(Q.data))) , Q = M._def.returns.safeParse(C, q); if (!Q.success) throw new On([Z(C, Q.error)]); return Q.data }) } , a.prototype.parameters = function() { return this._def.args } , a.prototype.returnType = function() { return this._def.returns } , a.prototype.args = function() { for (var h = [], p = 0; p < arguments.length; p++) h[p] = arguments[p]; return new a(ee(ee({}, this._def), { args: Ln.create(h).rest(zn.create()) })) } , a.prototype.returns = function(h) { return new a(ee(ee({}, this._def), { returns: h })) } , a.prototype.implement = function(h) { return this.parse(h) } , a.prototype.strictImplement = function(h) { return this.parse(h) } , a.create = function(h, p, d) { return new a(ee({ args: (h || Ln.create([])).rest(zn.create()), returns: p || zn.create(), typeName: Le.ZodFunction }, Ve(d))) } , a }(Fe) , zr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), Object.defineProperty(a.prototype, "schema", { get: function() { return this._def.getter() }, enumerable: !1, configurable: !0 }), a.prototype._parse = function(h, p, d) { return this._def.getter()._parse(h, p, d) } , a.create = function(h, p) { return new a(ee({ getter: h, typeName: Le.ZodLazy }, Ve(p))) } , a }(Fe) , Vr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return p !== this._def.value ? (this.addIssue(h, { code: be.invalid_type, expected: this._def.value, received: p }, { data: p }), Pe) : Ue(p) } , Object.defineProperty(a.prototype, "value", { get: function() { return this._def.value }, enumerable: !1, configurable: !0 }), a.create = function(h, p) { return new a(ee({ value: h, typeName: Le.ZodLiteral }, Ve(p))) } , a }(Fe); function Na(c) { return new $i({ values: c, typeName: Le.ZodEnum }) } var Le, $i = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return this._def.values.indexOf(p) === -1 ? (this.addIssue(h, { code: be.invalid_enum_value, options: this._def.values }, { data: p }), Pe) : Ue(p) } , Object.defineProperty(a.prototype, "options", { get: function() { return this._def.values }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "enum", { get: function() { var h, p, d = {}; try { for (var M = lt(this._def.values), F = M.next(); !F.done; F = M.next()) { var Z = F.value; d[Z] = Z } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "Values", { get: function() { var h, p, d = {}; try { for (var M = lt(this._def.values), F = M.next(); !F.done; F = M.next()) { var Z = F.value; d[Z] = Z } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d }, enumerable: !1, configurable: !0 }), Object.defineProperty(a.prototype, "Enum", { get: function() { var h, p, d = {}; try { for (var M = lt(this._def.values), F = M.next(); !F.done; F = M.next()) { var Z = F.value; d[Z] = Z } } catch (q) { h = { error: q } } finally { try { F && !F.done && (p = M.return) && p.call(M) } finally { if (h) throw h.error } } return d }, enumerable: !1, configurable: !0 }), a.create = Na, a }(Fe), Fr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { var M = rt.getValidEnumValues(this._def.values); return M.indexOf(p) === -1 ? (this.addIssue(h, { code: be.invalid_enum_value, options: rt.objectValues(M) }, { data: p }), Pe) : Ue(p) } , a.create = function(h, p) { return new a(ee({ values: h, typeName: Le.ZodNativeEnum }, Ve(p))) } , a }(Fe), _i = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { var M = this; return d !== we.promise && h.async === !1 ? (this.addIssue(h, { code: be.invalid_type, expected: we.promise, received: d }, { data: p }), Pe) : (p = d === we.promise ? p : Promise.resolve(p), Ue(p.then(function(F) { return M._def.type.parseAsync(F, { path: Nn(h.path), errorMap: h.errorMap }) }))) } , a.create = function(h, p) { return new a(ee({ type: h, typeName: Le.ZodPromise }, Ve(p))) } , a }(Fe), Mn = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype.innerType = function() { return this._def.schema } , a.prototype._parse = function(h, p, k) { var M = this , F = h.async === !1 , Z = this._def.effect || null , q = p , k = k; if (Z.type === "preprocess") { var O = Z.transform(p); if (h.async) return Promise.resolve(O).then(function(J) { return M._def.schema._parseAsync(h, J, wt(J)) }); if ((O = this._def.schema._parseSync(h, O, wt(O)))instanceof Promise) throw new Error("Asynchronous preprocess step encountered during synchronous parse operation. Use .parseAsync instead."); return O } if (Z.type === "refinement") { let J = function(ne, Y) { if (Y = Y.refinement(ne, C), Y instanceof Promise) { if (F) throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); return Y.then(function() { return ne }) } return ne }; var B = !1 , C = { addIssue: function(ne) { B = !0, M.addIssue(h, ne, { data: q }) }, get path() { return Nn(h.path) } }; if (C.addIssue = C.addIssue.bind(C), F) { var Q = this._def.schema._parseSync(h, q, k); return Lt(Q) ? Pe : (O = J(Q.value, Z), B ? Pe : Ue(O)) } return this._def.schema._parseAsync(h, q, k).then(function(ne) { return Lt(ne) ? Pe : J(ne.value, Z) }).then(function(ne) { return B ? Pe : Ue(ne) }) } if (Z.type === "transform") { let J = function(ne, Y) { if (ne = Y.transform(ne), ne instanceof Promise && F) throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead."); return ne }; return F ? (Q = this._def.schema._parseSync(h, q, k), Lt(Q) ? Pe : (O = J(Q.value, Z), Ue(O))) : this._def.schema._parseAsync(h, q, k).then(function(ne) { return Lt(ne) ? Pe : J(ne.value, Z) }).then(function(ne) { return Ue(ne) }) } rt.assertNever(Z) } , a.create = function(h, p, d) { return new a(ee({ schema: h, typeName: Le.ZodEffects, effect: p }, Ve(d))) } , a.createWithPreprocess = function(h, p, d) { return new a(ee({ schema: p, effect: { type: "preprocess", transform: h }, typeName: Le.ZodEffects }, Ve(d))) } , a }(Fe), on = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d === we.undefined ? Ue(void 0) : this._def.innerType._parse(h, p, d) } , a.prototype.unwrap = function() { return this._def.innerType } , a.create = function(h, p) { return new a(ee({ innerType: h, typeName: Le.ZodOptional }, Ve(p))) } , a }(Fe), Gn = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d === we.null ? Ue(null) : this._def.innerType._parse(h, p, d) } , a.prototype.unwrap = function() { return this._def.innerType } , a.create = function(h, p) { return new a(ee({ innerType: h, typeName: Le.ZodNullable }, Ve(p))) } , a }(Fe), Gr = function(c) { function a() { return c !== null && c.apply(this, arguments) || this } return He(a, c), a.prototype._parse = function(h, p, d) { return d === we.undefined && (p = this._def.defaultValue()), this._def.innerType._parse(h, p, wt(p)) } , a.prototype.removeDefault = function() { return this._def.innerType } , a.create = function(h, p) { return new on(ee({ innerType: h, typeName: Le.ZodOptional }, Ve(p))) } , a }(Fe), Zr = function(c, a) { return c ? hi.create().refine(c, a) : hi.create() }, La = { object: un.lazycreate }; (function(c) { c.ZodString = "ZodString", c.ZodNumber = "ZodNumber", c.ZodBigInt = "ZodBigInt", c.ZodBoolean = "ZodBoolean", c.ZodDate = "ZodDate", c.ZodUndefined = "ZodUndefined", c.ZodNull = "ZodNull", c.ZodAny = "ZodAny", c.ZodUnknown = "ZodUnknown", c.ZodNever = "ZodNever", c.ZodVoid = "ZodVoid", c.ZodArray = "ZodArray", c.ZodObject = "ZodObject", c.ZodUnion = "ZodUnion", c.ZodIntersection = "ZodIntersection", c.ZodTuple = "ZodTuple", c.ZodRecord = "ZodRecord", c.ZodMap = "ZodMap", c.ZodSet = "ZodSet", c.ZodFunction = "ZodFunction", c.ZodLazy = "ZodLazy", c.ZodLiteral = "ZodLiteral", c.ZodEnum = "ZodEnum", c.ZodEffects = "ZodEffects", c.ZodNativeEnum = "ZodNativeEnum", c.ZodOptional = "ZodOptional", c.ZodNullable = "ZodNullable", c.ZodDefault = "ZodDefault", c.ZodPromise = "ZodPromise" } )(Le = Le || {}); var Ma = function(c, a) { return a === void 0 && (a = { message: "Input not instance of " + c.name }), Zr(function(h) { return h instanceof c }, a) } , j = Ki.create , fe = Pr.create , Hr = Or.create , Ae = xr.create , Ra = Nr.create , Da = Lr.create , Wi = Mr.create , ka = hi.create , Zn = zn.create , Ba = Pn.create , Ua = Rr.create , Be = Fn.create , he = un.create , za = un.strictCreate , Ji = Yi.create , Va = pi.create , Fa = Ln.create , Ga = Dr.create , Za = kr.create , Ha = Br.create , ja = Ur.create , qa = zr.create , zt = Vr.create , Ka = $i.create , Rn = Fr.create , Ya = _i.create , Er = Mn.create , jr = on.create , $a = Gn.create , qr = Mn.createWithPreprocess , Wa = function() { return j().optional() } , Ja = function() { return fe().optional() } , Xa = function() { return Ae().optional() }; Object.freeze({ __proto__: null, ZodParsedType: we, getParsedType: wt, makeIssue: ui, EMPTY_PATH: Ca, pathToArray: Nn, pathFromArray: Ar, ParseContext: li, INVALID: Pe, OK: Ue, isInvalid: Lt, isOk: Qt, isAsync: vn, ZodType: Fe, ZodString: Ki, ZodNumber: Pr, ZodBigInt: Or, ZodBoolean: xr, ZodDate: Nr, ZodUndefined: Lr, ZodNull: Mr, ZodAny: hi, ZodUnknown: zn, ZodNever: Pn, ZodVoid: Rr, ZodArray: Fn, get objectUtil() { return Vn }, mergeObjects: xa, ZodObject: un, ZodUnion: Yi, ZodIntersection: pi, ZodTuple: Ln, ZodRecord: Dr, ZodMap: kr, ZodSet: Br, ZodFunction: Ur, ZodLazy: zr, ZodLiteral: Vr, ZodEnum: $i, ZodNativeEnum: Fr, ZodPromise: _i, ZodEffects: Mn, ZodTransformer: Mn, ZodOptional: on, ZodNullable: Gn, ZodDefault: Gr, custom: Zr, Schema: Fe, ZodSchema: Fe, late: La, get ZodFirstPartyTypeKind() { return Le }, any: ka, array: Be, bigint: Hr, boolean: Ae, date: Ra, effect: Er, enum: Ka, function: ja, instanceof: Ma, intersection: Va, lazy: qa, literal: zt, map: Za, nativeEnum: Rn, never: Ba, null: Wi, nullable: $a, number: fe, object: he, oboolean: Xa, onumber: Ja, optional: jr, ostring: Wa, preprocess: qr, promise: Ya, record: Ga, set: Ha, strictObject: za, string: j, transformer: Er, tuple: Fa, undefined: Da, union: Ji, unknown: Zn, void: Ua, ZodIssueCode: be, quotelessJson: Ta, ZodError: On, defaultErrorMap: ji, get overrideErrorMap() { return qi }, setErrorMap: Ia }); var Kr = { exports: {} }; (function(c) { var a = function(h) { var p = 1e7 , d = 7 , M = 9007199254740992 , F = J(M) , Z = "0123456789abcdefghijklmnopqrstuvwxyz" , q = typeof BigInt == "function"; function k(t, n, i, r) { return typeof t > "u" ? k[0] : typeof n < "u" ? +n == 10 && !i ? ae(t) : kn(t, n, i, r) : ae(t) } function O(t, n) { this.value = t, this.sign = n, this.isSmall = !1 } O.prototype = Object.create(k.prototype); function B(t) { this.value = t, this.sign = t < 0, this.isSmall = !0 } B.prototype = Object.create(k.prototype); function C(t) { this.value = t } C.prototype = Object.create(k.prototype); function Q(t) { return -M < t && t < M } function J(t) { return t < 1e7 ? [t] : t < 1e14 ? [t % 1e7, Math.floor(t / 1e7)] : [t % 1e7, Math.floor(t / 1e7) % 1e7, Math.floor(t / 1e14)] } function ne(t) { Y(t); var n = t.length; if (n < 4 && kt(t, F) < 0) switch (n) { case 0: return 0; case 1: return t[0]; case 2: return t[0] + t[1] * p; default: return t[0] + (t[1] + t[2] * p) * p } return t } function Y(t) { for (var n = t.length; t[--n] === 0; ) ; t.length = n + 1 } function Me(t) { for (var n = new Array(t), i = -1; ++i < t; ) n[i] = 0; return n } function le(t) { return t > 0 ? Math.floor(t) : Math.ceil(t) } function Se(t, n) { var i = t.length, r = n.length, s = new Array(i), u = 0, o = p, l, f; for (f = 0; f < r; f++) l = t[f] + n[f] + u, u = l >= o ? 1 : 0, s[f] = l - u * o; for (; f < i; ) l = t[f] + u, u = l === o ? 1 : 0, s[f++] = l - u * o; return u > 0 && s.push(u), s } function ye(t, n) { return t.length >= n.length ? Se(t, n) : Se(n, t) } function oe(t, n) { var i = t.length, r = new Array(i), s = p, u, o; for (o = 0; o < i; o++) u = t[o] - s + n, n = Math.floor(u / s), r[o] = u - n * s, n += 1; for (; n > 0; ) r[o++] = n % s, n = Math.floor(n / s); return r } O.prototype.add = function(t) { var n = ae(t); if (this.sign !== n.sign) return this.subtract(n.negate()); var i = this.value , r = n.value; return n.isSmall ? new O(oe(i, Math.abs(r)),this.sign) : new O(ye(i, r),this.sign) } , O.prototype.plus = O.prototype.add, B.prototype.add = function(t) { var n = ae(t) , i = this.value; if (i < 0 !== n.sign) return this.subtract(n.negate()); var r = n.value; if (n.isSmall) { if (Q(i + r)) return new B(i + r); r = J(Math.abs(r)) } return new O(oe(r, Math.abs(i)),i < 0) } , B.prototype.plus = B.prototype.add, C.prototype.add = function(t) { return new C(this.value + ae(t).value) } , C.prototype.plus = C.prototype.add; function We(t, n) { var i = t.length, r = n.length, s = new Array(i), u = 0, o = p, l, f; for (l = 0; l < r; l++) f = t[l] - u - n[l], f < 0 ? (f += o, u = 1) : u = 0, s[l] = f; for (l = r; l < i; l++) { if (f = t[l] - u, f < 0) f += o; else { s[l++] = f; break } s[l] = f } for (; l < i; l++) s[l] = t[l]; return Y(s), s } function ct(t, n, i) { var r; return kt(t, n) >= 0 ? r = We(t, n) : (r = We(n, t), i = !i), r = ne(r), typeof r == "number" ? (i && (r = -r), new B(r)) : new O(r,i) } function je(t, n, i) { var r = t.length, s = new Array(r), u = -n, o = p, l, f; for (l = 0; l < r; l++) f = t[l] + u, u = Math.floor(f / o), f %= o, s[l] = f < 0 ? f + o : f; return s = ne(s), typeof s == "number" ? (i && (s = -s), new B(s)) : new O(s,i) } O.prototype.subtract = function(t) { var n = ae(t); if (this.sign !== n.sign) return this.add(n.negate()); var i = this.value , r = n.value; return n.isSmall ? je(i, Math.abs(r), this.sign) : ct(i, r, this.sign) } , O.prototype.minus = O.prototype.subtract, B.prototype.subtract = function(t) { var n = ae(t) , i = this.value; if (i < 0 !== n.sign) return this.add(n.negate()); var r = n.value; return n.isSmall ? new B(i - r) : je(r, Math.abs(i), i >= 0) } , B.prototype.minus = B.prototype.subtract, C.prototype.subtract = function(t) { return new C(this.value - ae(t).value) } , C.prototype.minus = C.prototype.subtract, O.prototype.negate = function() { return new O(this.value,!this.sign) } , B.prototype.negate = function() { var t = this.sign , n = new B(-this.value); return n.sign = !t, n } , C.prototype.negate = function() { return new C(-this.value) } , O.prototype.abs = function() { return new O(this.value,!1) } , B.prototype.abs = function() { return new B(Math.abs(this.value)) } , C.prototype.abs = function() { return new C(this.value >= 0 ? this.value : -this.value) } ; function Pt(t, n) { var i = t.length, r = n.length, s = i + r, u = Me(s), o = p, l, f, g, y, _; for (g = 0; g < i; ++g) { y = t[g]; for (var v = 0; v < r; ++v) _ = n[v], l = y * _ + u[g + v], f = Math.floor(l / o), u[g + v] = l - f * o, u[g + v + 1] += f } return Y(u), u } function ft(t, n) { var i = t.length, r = new Array(i), s = p, u = 0, o, l; for (l = 0; l < i; l++) o = t[l] * n + u, u = Math.floor(o / s), r[l] = o - u * s; for (; u > 0; ) r[l++] = u % s, u = Math.floor(u / s); return r } function dt(t, n) { for (var i = []; n-- > 0; ) i.push(0); return i.concat(t) } function qe(t, n) { var i = Math.max(t.length, n.length); if (i <= 30) return Pt(t, n); i = Math.ceil(i / 2); var r = t.slice(i) , s = t.slice(0, i) , u = n.slice(i) , o = n.slice(0, i) , l = qe(s, o) , f = qe(r, u) , g = qe(ye(s, r), ye(o, u)) , y = ye(ye(l, dt(We(We(g, l), f), i)), dt(f, 2 * i)); return Y(y), y } function pe(t, n) { return -.012 * t - .012 * n + 15e-6 * t * n > 0 } O.prototype.multiply = function(t) { var n = ae(t), i = this.value, r = n.value, s = this.sign !== n.sign, u; if (n.isSmall) { if (r === 0) return k[0]; if (r === 1) return this; if (r === -1) return this.negate(); if (u = Math.abs(r), u < p) return new O(ft(i, u),s); r = J(u) } return pe(i.length, r.length) ? new O(qe(i, r),s) : new O(Pt(i, r),s) } , O.prototype.times = O.prototype.multiply; function Vt(t, n, i) { return t < p ? new O(ft(n, t),i) : new O(Pt(n, J(t)),i) } B.prototype._multiplyBySmall = function(t) { return Q(t.value * this.value) ? new B(t.value * this.value) : Vt(Math.abs(t.value), J(Math.abs(this.value)), this.sign !== t.sign) } , O.prototype._multiplyBySmall = function(t) { return t.value === 0 ? k[0] : t.value === 1 ? this : t.value === -1 ? this.negate() : Vt(Math.abs(t.value), this.value, this.sign !== t.sign) } , B.prototype.multiply = function(t) { return ae(t)._multiplyBySmall(this) } , B.prototype.times = B.prototype.multiply, C.prototype.multiply = function(t) { return new C(this.value * ae(t).value) } , C.prototype.times = C.prototype.multiply; function re(t) { var n = t.length, i = Me(n + n), r = p, s, u, o, l, f; for (o = 0; o < n; o++) { l = t[o], u = 0 - l * l; for (var g = o; g < n; g++) f = t[g], s = 2 * (l * f) + i[o + g] + u, u = Math.floor(s / r), i[o + g] = s - u * r; i[o + n] = u } return Y(i), i } O.prototype.square = function() { return new O(re(this.value),!1) } , B.prototype.square = function() { var t = this.value * this.value; return Q(t) ? new B(t) : new O(re(J(Math.abs(this.value))),!1) } , C.prototype.square = function(t) { return new C(this.value * this.value) } ; function Ot(t, n) { var i = t.length, r = n.length, s = p, u = Me(n.length), o = n[r - 1], l = Math.ceil(s / (2 * o)), f = ft(t, l), g = ft(n, l), y, _, v, b, T, x, S; for (f.length <= i && f.push(0), g.push(0), o = g[r - 1], _ = i - r; _ >= 0; _--) { for (y = s - 1, f[_ + r] !== o && (y = Math.floor((f[_ + r] * s + f[_ + r - 1]) / o)), v = 0, b = 0, x = g.length, T = 0; T < x; T++) v += y * g[T], S = Math.floor(v / s), b += f[_ + T] - (v - S * s), v = S, b < 0 ? (f[_ + T] = b + s, b = -1) : (f[_ + T] = b, b = 0); for (; b !== 0; ) { for (y -= 1, v = 0, T = 0; T < x; T++) v += f[_ + T] - s + g[T], v < 0 ? (f[_ + T] = v + s, v = 0) : (f[_ + T] = v, v = 1); b += v } u[_] = y } return f = ke(f, l)[0], [ne(u), ne(f)] } function Ft(t, n) { for (var i = t.length, r = n.length, s = [], u = [], o = p, l, f, g, y, _; i; ) { if (u.unshift(t[--i]), Y(u), kt(u, n) < 0) { s.push(0); continue } f = u.length, g = u[f - 1] * o + u[f - 2], y = n[r - 1] * o + n[r - 2], f > r && (g = (g + 1) * o), l = Math.ceil(g / y); do { if (_ = ft(n, l), kt(_, u) <= 0) break; l-- } while (l); s.push(l), u = We(u, _) } return s.reverse(), [ne(s), ne(u)] } function ke(t, n) { var i = t.length, r = Me(i), s = p, u, o, l, f; for (l = 0, u = i - 1; u >= 0; --u) f = l * s + t[u], o = le(f / n), l = f - o * n, r[u] = o | 0; return [r, l | 0] } function ot(t, n) { var i, r = ae(n); if (q) return [new C(t.value / r.value), new C(t.value % r.value)]; var s = t.value, u = r.value, o; if (u === 0) throw new Error("Cannot divide by zero"); if (t.isSmall) return r.isSmall ? [new B(le(s / u)), new B(s % u)] : [k[0], t]; if (r.isSmall) { if (u === 1) return [t, k[0]]; if (u == -1) return [t.negate(), k[0]]; var l = Math.abs(u); if (l < p) { i = ke(s, l), o = ne(i[0]); var f = i[1]; return t.sign && (f = -f), typeof o == "number" ? (t.sign !== r.sign && (o = -o), [new B(o), new B(f)]) : [new O(o,t.sign !== r.sign), new B(f)] } u = J(l) } var g = kt(s, u); if (g === -1) return [k[0], t]; if (g === 0) return [k[t.sign === r.sign ? 1 : -1], k[0]]; s.length + u.length <= 200 ? i = Ot(s, u) : i = Ft(s, u), o = i[0]; var y = t.sign !== r.sign , _ = i[1] , v = t.sign; return typeof o == "number" ? (y && (o = -o), o = new B(o)) : o = new O(o,y), typeof _ == "number" ? (v && (_ = -_), _ = new B(_)) : _ = new O(_,v), [o, _] } O.prototype.divmod = function(t) { var n = ot(this, t); return { quotient: n[0], remainder: n[1] } } , C.prototype.divmod = B.prototype.divmod = O.prototype.divmod, O.prototype.divide = function(t) { return ot(this, t)[0] } , C.prototype.over = C.prototype.divide = function(t) { return new C(this.value / ae(t).value) } , B.prototype.over = B.prototype.divide = O.prototype.over = O.prototype.divide, O.prototype.mod = function(t) { return ot(this, t)[1] } , C.prototype.mod = C.prototype.remainder = function(t) { return new C(this.value % ae(t).value) } , B.prototype.remainder = B.prototype.mod = O.prototype.remainder = O.prototype.mod, O.prototype.pow = function(t) { var n = ae(t), i = this.value, r = n.value, s, u, o; if (r === 0) return k[1]; if (i === 0) return k[0]; if (i === 1) return k[1]; if (i === -1) return n.isEven() ? k[1] : k[-1]; if (n.sign) return k[0]; if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large."); if (this.isSmall && Q(s = Math.pow(i, r))) return new B(le(s)); for (u = this, o = k[1]; r & !0 && (o = o.times(u), --r), r !== 0; ) r /= 2, u = u.square(); return o } , B.prototype.pow = O.prototype.pow, C.prototype.pow = function(t) { var n = ae(t) , i = this.value , r = n.value , s = BigInt(0) , u = BigInt(1) , o = BigInt(2); if (r === s) return k[1]; if (i === s) return k[0]; if (i === u) return k[1]; if (i === BigInt(-1)) return n.isEven() ? k[1] : k[-1]; if (n.isNegative()) return new C(s); for (var l = this, f = k[1]; (r & u) === u && (f = f.times(l), --r), r !== s; ) r /= o, l = l.square(); return f } , O.prototype.modPow = function(t, n) { if (t = ae(t), n = ae(n), n.isZero()) throw new Error("Cannot take modPow with modulus 0"); var i = k[1] , r = this.mod(n); for (t.isNegative() && (t = t.multiply(k[-1]), r = r.modInv(n)); t.isPositive(); ) { if (r.isZero()) return k[0]; t.isOdd() && (i = i.multiply(r).mod(n)), t = t.divide(2), r = r.square().mod(n) } return i } , C.prototype.modPow = B.prototype.modPow = O.prototype.modPow; function kt(t, n) { if (t.length !== n.length) return t.length > n.length ? 1 : -1; for (var i = t.length - 1; i >= 0; i--) if (t[i] !== n[i]) return t[i] > n[i] ? 1 : -1; return 0 } O.prototype.compareAbs = function(t) { var n = ae(t) , i = this.value , r = n.value; return n.isSmall ? 1 : kt(i, r) } , B.prototype.compareAbs = function(t) { var n = ae(t) , i = Math.abs(this.value) , r = n.value; return n.isSmall ? (r = Math.abs(r), i === r ? 0 : i > r ? 1 : -1) : -1 } , C.prototype.compareAbs = function(t) { var n = this.value , i = ae(t).value; return n = n >= 0 ? n : -n, i = i >= 0 ? i : -i, n === i ? 0 : n > i ? 1 : -1 } , O.prototype.compare = function(t) { if (t === 1 / 0) return -1; if (t === -1 / 0) return 1; var n = ae(t) , i = this.value , r = n.value; return this.sign !== n.sign ? n.sign ? 1 : -1 : n.isSmall ? this.sign ? -1 : 1 : kt(i, r) * (this.sign ? -1 : 1) } , O.prototype.compareTo = O.prototype.compare, B.prototype.compare = function(t) { if (t === 1 / 0) return -1; if (t === -1 / 0) return 1; var n = ae(t) , i = this.value , r = n.value; return n.isSmall ? i == r ? 0 : i > r ? 1 : -1 : i < 0 !== n.sign ? i < 0 ? -1 : 1 : i < 0 ? 1 : -1 } , B.prototype.compareTo = B.prototype.compare, C.prototype.compare = function(t) { if (t === 1 / 0) return -1; if (t === -1 / 0) return 1; var n = this.value , i = ae(t).value; return n === i ? 0 : n > i ? 1 : -1 } , C.prototype.compareTo = C.prototype.compare, O.prototype.equals = function(t) { return this.compare(t) === 0 } , C.prototype.eq = C.prototype.equals = B.prototype.eq = B.prototype.equals = O.prototype.eq = O.prototype.equals, O.prototype.notEquals = function(t) { return this.compare(t) !== 0 } , C.prototype.neq = C.prototype.notEquals = B.prototype.neq = B.prototype.notEquals = O.prototype.neq = O.prototype.notEquals, O.prototype.greater = function(t) { return this.compare(t) > 0 } , C.prototype.gt = C.prototype.greater = B.prototype.gt = B.prototype.greater = O.prototype.gt = O.prototype.greater, O.prototype.lesser = function(t) { return this.compare(t) < 0 } , C.prototype.lt = C.prototype.lesser = B.prototype.lt = B.prototype.lesser = O.prototype.lt = O.prototype.lesser, O.prototype.greaterOrEquals = function(t) { return this.compare(t) >= 0 } , C.prototype.geq = C.prototype.greaterOrEquals = B.prototype.geq = B.prototype.greaterOrEquals = O.prototype.geq = O.prototype.greaterOrEquals, O.prototype.lesserOrEquals = function(t) { return this.compare(t) <= 0 } , C.prototype.leq = C.prototype.lesserOrEquals = B.prototype.leq = B.prototype.lesserOrEquals = O.prototype.leq = O.prototype.lesserOrEquals, O.prototype.isEven = function() { return (this.value[0] & 1) === 0 } , B.prototype.isEven = function() { return (this.value & 1) === 0 } , C.prototype.isEven = function() { return (this.value & BigInt(1)) === BigInt(0) } , O.prototype.isOdd = function() { return (this.value[0] & 1) === 1 } , B.prototype.isOdd = function() { return (this.value & 1) === 1 } , C.prototype.isOdd = function() { return (this.value & BigInt(1)) === BigInt(1) } , O.prototype.isPositive = function() { return !this.sign } , B.prototype.isPositive = function() { return this.value > 0 } , C.prototype.isPositive = B.prototype.isPositive, O.prototype.isNegative = function() { return this.sign } , B.prototype.isNegative = function() { return this.value < 0 } , C.prototype.isNegative = B.prototype.isNegative, O.prototype.isUnit = function() { return !1 } , B.prototype.isUnit = function() { return Math.abs(this.value) === 1 } , C.prototype.isUnit = function() { return this.abs().value === BigInt(1) } , O.prototype.isZero = function() { return !1 } , B.prototype.isZero = function() { return this.value === 0 } , C.prototype.isZero = function() { return this.value === BigInt(0) } , O.prototype.isDivisibleBy = function(t) { var n = ae(t); return n.isZero() ? !1 : n.isUnit() ? !0 : n.compareAbs(2) === 0 ? this.isEven() : this.mod(n).isZero() } , C.prototype.isDivisibleBy = B.prototype.isDivisibleBy = O.prototype.isDivisibleBy; function yn(t) { var n = t.abs(); if (n.isUnit()) return !1; if (n.equals(2) || n.equals(3) || n.equals(5)) return !0; if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return !1; if (n.lesser(49)) return !0 } function Gt(t, n) { for (var i = t.prev(), r = i, s = 0, u, o, l; r.isEven(); ) r = r.divide(2), s++; e: for (o = 0; o < n.length; o++) if (!t.lesser(n[o]) && (l = a(n[o]).modPow(r, t), !(l.isUnit() || l.equals(i)))) { for (u = s - 1; u != 0; u--) { if (l = l.square().mod(t), l.isUnit()) return !1; if (l.equals(i)) continue e } return !1 } return !0 } O.prototype.isPrime = function(t) { var n = yn(this); if (n !== h) return n; var i = this.abs() , r = i.bitLength(); if (r <= 64) return Gt(i, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]); for (var s = Math.log(2) * r.toJSNumber(), u = Math.ceil(t === !0 ? 2 * Math.pow(s, 2) : s), o = [], l = 0; l < u; l++) o.push(a(l + 2)); return Gt(i, o) } , C.prototype.isPrime = B.prototype.isPrime = O.prototype.isPrime, O.prototype.isProbablePrime = function(t, n) { var i = yn(this); if (i !== h) return i; for (var r = this.abs(), s = t === h ? 5 : t, u = [], o = 0; o < s; o++) u.push(a.randBetween(2, r.minus(2), n)); return Gt(r, u) } , C.prototype.isProbablePrime = B.prototype.isProbablePrime = O.prototype.isProbablePrime, O.prototype.modInv = function(t) { for (var n = a.zero, i = a.one, r = ae(t), s = this.abs(), u, o, l; !s.isZero(); ) u = r.divide(s), o = n, l = r, n = i, r = s, i = o.subtract(u.multiply(i)), s = l.subtract(u.multiply(s)); if (!r.isUnit()) throw new Error(this.toString() + " and " + t.toString() + " are not co-prime"); return n.compare(0) === -1 && (n = n.add(t)), this.isNegative() ? n.negate() : n } , C.prototype.modInv = B.prototype.modInv = O.prototype.modInv, O.prototype.next = function() { var t = this.value; return this.sign ? je(t, 1, this.sign) : new O(oe(t, 1),this.sign) } , B.prototype.next = function() { var t = this.value; return t + 1 < M ? new B(t + 1) : new O(F,!1) } , C.prototype.next = function() { return new C(this.value + BigInt(1)) } , O.prototype.prev = function() { var t = this.value; return this.sign ? new O(oe(t, 1),!0) : je(t, 1, this.sign) } , B.prototype.prev = function() { var t = this.value; return t - 1 > -M ? new B(t - 1) : new O(F,!0) } , C.prototype.prev = function() { return new C(this.value - BigInt(1)) } ; for (var Mt = [1]; 2 * Mt[Mt.length - 1] <= p; ) Mt.push(2 * Mt[Mt.length - 1]); var Xe = Mt.length , xt = Mt[Xe - 1]; function en(t) { return Math.abs(t) <= p } O.prototype.shiftLeft = function(t) { var n = ae(t).toJSNumber(); if (!en(n)) throw new Error(String(n) + " is too large for shifting."); if (n < 0) return this.shiftRight(-n); var i = this; if (i.isZero()) return i; for (; n >= Xe; ) i = i.multiply(xt), n -= Xe - 1; return i.multiply(Mt[n]) } , C.prototype.shiftLeft = B.prototype.shiftLeft = O.prototype.shiftLeft, O.prototype.shiftRight = function(t) { var n, i = ae(t).toJSNumber(); if (!en(i)) throw new Error(String(i) + " is too large for shifting."); if (i < 0) return this.shiftLeft(-i); for (var r = this; i >= Xe; ) { if (r.isZero() || r.isNegative() && r.isUnit()) return r; n = ot(r, xt), r = n[1].isNegative() ? n[0].prev() : n[0], i -= Xe - 1 } return n = ot(r, Mt[i]), n[1].isNegative() ? n[0].prev() : n[0] } , C.prototype.shiftRight = B.prototype.shiftRight = O.prototype.shiftRight; function Kt(t, n, i) { n = ae(n); for (var r = t.isNegative(), s = n.isNegative(), u = r ? t.not() : t, o = s ? n.not() : n, l = 0, f = 0, g = null, y = null, _ = []; !u.isZero() || !o.isZero(); ) g = ot(u, xt), l = g[1].toJSNumber(), r && (l = xt - 1 - l), y = ot(o, xt), f = y[1].toJSNumber(), s && (f = xt - 1 - f), u = g[0], o = y[0], _.push(i(l, f)); for (var v = i(r ? 1 : 0, s ? 1 : 0) !== 0 ? a(-1) : a(0), b = _.length - 1; b >= 0; b -= 1) v = v.multiply(xt).add(a(_[b])); return v } O.prototype.not = function() { return this.negate().prev() } , C.prototype.not = B.prototype.not = O.prototype.not, O.prototype.and = function(t) { return Kt(this, t, function(n, i) { return n & i }) } , C.prototype.and = B.prototype.and = O.prototype.and, O.prototype.or = function(t) { return Kt(this, t, function(n, i) { return n | i }) } , C.prototype.or = B.prototype.or = O.prototype.or, O.prototype.xor = function(t) { return Kt(this, t, function(n, i) { return n ^ i }) } , C.prototype.xor = B.prototype.xor = O.prototype.xor; var Ce = 1 << 30 , tt = (p & -p) * (p & -p) | Ce; function Ke(t) { var n = t.value , i = typeof n == "number" ? n | Ce : typeof n == "bigint" ? n | BigInt(Ce) : n[0] + n[1] * p | tt; return i & -i } function Rt(t, n) { if (n.compareTo(t) <= 0) { var i = Rt(t, n.square(n)) , r = i.p , s = i.e , u = r.multiply(n); return u.compareTo(t) <= 0 ? { p: u, e: s * 2 + 1 } : { p: r, e: s * 2 } } return { p: a(1), e: 0 } } O.prototype.bitLength = function() { var t = this; return t.compareTo(a(0)) < 0 && (t = t.negate().subtract(a(1))), t.compareTo(a(0)) === 0 ? a(0) : a(Rt(t, a(2)).e).add(a(1)) } , C.prototype.bitLength = B.prototype.bitLength = O.prototype.bitLength; function Zt(t, n) { return t = ae(t), n = ae(n), t.greater(n) ? t : n } function tn(t, n) { return t = ae(t), n = ae(n), t.lesser(n) ? t : n } function cn(t, n) { if (t = ae(t).abs(), n = ae(n).abs(), t.equals(n)) return t; if (t.isZero()) return n; if (n.isZero()) return t; for (var i = k[1], r, s; t.isEven() && n.isEven(); ) r = tn(Ke(t), Ke(n)), t = t.divide(r), n = n.divide(r), i = i.multiply(r); for (; t.isEven(); ) t = t.divide(Ke(t)); do { for (; n.isEven(); ) n = n.divide(Ke(n)); t.greater(n) && (s = n, n = t, t = s), n = n.subtract(t) } while (!n.isZero()); return i.isUnit() ? t : t.multiply(i) } function wn(t, n) { return t = ae(t).abs(), n = ae(n).abs(), t.divide(cn(t, n)).multiply(n) } function bn(t, n, i) { t = ae(t), n = ae(n); var r = i || Math.random , s = tn(t, n) , u = Zt(t, n) , o = u.subtract(s).add(1); if (o.isSmall) return s.add(Math.floor(r() * o)); for (var l = Je(o, p).value, f = [], g = !0, y = 0; y < l.length; y++) { var _ = g ? l[y] : p , v = le(r() * _); f.push(v), v < _ && (g = !1) } return s.add(k.fromArray(f, p, !1)) } var kn = function(t, n, i, r) { i = i || Z, t = String(t), r || (t = t.toLowerCase(), i = i.toLowerCase()); var s = t.length, u, o = Math.abs(n), l = {}; for (u = 0; u < i.length; u++) l[i[u]] = u; for (u = 0; u < s; u++) { var f = t[u]; if (f !== "-" && f in l && l[f] >= o) { if (f === "1" && o === 1) continue; throw new Error(f + " is not a valid digit in base " + n + ".") } } n = ae(n); var g = [] , y = t[0] === "-"; for (u = y ? 1 : 0; u < t.length; u++) { var f = t[u]; if (f in l) g.push(ae(l[f])); else if (f === "<") { var _ = u; do u++; while (t[u] !== ">" && u < t.length); g.push(ae(t.slice(_ + 1, u))) } else throw new Error(f + " is not a valid character") } return Sn(g, n, y) }; function Sn(t, n, i) { var r = k[0], s = k[1], u; for (u = t.length - 1; u >= 0; u--) r = r.add(t[u].times(s)), s = s.times(n); return i ? r.negate() : r } function Bn(t, n) { return n = n || Z, t < n.length ? n[t] : "<" + t + ">" } function Je(t, n) { if (n = a(n), n.isZero()) { if (t.isZero()) return { value: [0], isNegative: !1 }; throw new Error("Cannot convert nonzero numbers to base 0.") } if (n.equals(-1)) { if (t.isZero()) return { value: [0], isNegative: !1 }; if (t.isNegative()) return { value: [].concat.apply([], Array.apply(null, Array(-t.toJSNumber())).map(Array.prototype.valueOf, [1, 0])), isNegative: !1 }; var i = Array.apply(null, Array(t.toJSNumber() - 1)).map(Array.prototype.valueOf, [0, 1]); return i.unshift([1]), { value: [].concat.apply([], i), isNegative: !1 } } var r = !1; if (t.isNegative() && n.isPositive() && (r = !0, t = t.abs()), n.isUnit()) return t.isZero() ? { value: [0], isNegative: !1 } : { value: Array.apply(null, Array(t.toJSNumber())).map(Number.prototype.valueOf, 1), isNegative: r }; for (var s = [], u = t, o; u.isNegative() || u.compareAbs(n) >= 0; ) { o = u.divmod(n), u = o.quotient; var l = o.remainder; l.isNegative() && (l = n.minus(l).abs(), u = u.next()), s.push(l.toJSNumber()) } return s.push(u.toJSNumber()), { value: s.reverse(), isNegative: r } } function nn(t, n, i) { var r = Je(t, n); return (r.isNegative ? "-" : "") + r.value.map(function(s) { return Bn(s, i) }).join("") } O.prototype.toArray = function(t) { return Je(this, t) } , B.prototype.toArray = function(t) { return Je(this, t) } , C.prototype.toArray = function(t) { return Je(this, t) } , O.prototype.toString = function(t, n) { if (t === h && (t = 10), t !== 10) return nn(this, t, n); for (var i = this.value, r = i.length, s = String(i[--r]), u = "0000000", o; --r >= 0; ) o = String(i[r]), s += u.slice(o.length) + o; var l = this.sign ? "-" : ""; return l + s } , B.prototype.toString = function(t, n) { return t === h && (t = 10), t != 10 ? nn(this, t, n) : String(this.value) } , C.prototype.toString = B.prototype.toString, C.prototype.toJSON = O.prototype.toJSON = B.prototype.toJSON = function() { return this.toString() } , O.prototype.valueOf = function() { return parseInt(this.toString(), 10) } , O.prototype.toJSNumber = O.prototype.valueOf, B.prototype.valueOf = function() { return this.value } , B.prototype.toJSNumber = B.prototype.valueOf, C.prototype.valueOf = C.prototype.toJSNumber = function() { return parseInt(this.toString(), 10) } ; function Qe(t) { if (Q(+t)) { var n = +t; if (n === le(n)) return q ? new C(BigInt(n)) : new B(n); throw new Error("Invalid integer: " + t) } var i = t[0] === "-"; i && (t = t.slice(1)); var r = t.split(/e/i); if (r.length > 2) throw new Error("Invalid integer: " + r.join("e")); if (r.length === 2) { var s = r[1]; if (s[0] === "+" && (s = s.slice(1)), s = +s, s !== le(s) || !Q(s)) throw new Error("Invalid integer: " + s + " is not a valid exponent."); var u = r[0] , o = u.indexOf("."); if (o >= 0 && (s -= u.length - o - 1, u = u.slice(0, o) + u.slice(o + 1)), s < 0) throw new Error("Cannot include negative exponent part for integers"); u += new Array(s + 1).join("0"), t = u } var l = /^([0-9][0-9]*)$/.test(t); if (!l) throw new Error("Invalid integer: " + t); if (q) return new C(BigInt(i ? "-" + t : t)); for (var f = [], g = t.length, y = d, _ = g - y; g > 0; ) f.push(+t.slice(_, g)), _ -= y, _ < 0 && (_ = 0), g -= y; return Y(f), new O(f,i) } function En(t) { if (q) return new C(BigInt(t)); if (Q(t)) { if (t !== le(t)) throw new Error(t + " is not an integer."); return new B(t) } return Qe(t.toString()) } function ae(t) { return typeof t == "number" ? En(t) : typeof t == "string" ? Qe(t) : typeof t == "bigint" ? new C(t) : t } for (var e = 0; e < 1e3; e++) k[e] = ae(e), e > 0 && (k[-e] = ae(-e)); return k.one = k[1], k.zero = k[0], k.minusOne = k[-1], k.max = Zt, k.min = tn, k.gcd = cn, k.lcm = wn, k.isInstance = function(t) { return t instanceof O || t instanceof B || t instanceof C } , k.randBetween = bn, k.fromArray = function(t, n, i) { return Sn(t.map(ae), ae(n || 10), i) } , k }(); c.hasOwnProperty("exports") && (c.exports = a) } )(Kr); var Qa = Kr.exports , Yr = 64 , Vi = 16 , an = Yr / Vi; function eo() { try { return !0 } catch { return !1 } } function to(c, a, h) { let p = 0; for (let d = 0; d < h; d++) { let M = c[a + d]; if (M === void 0) break; p += M * Math.pow(16, d) } return p } function $r(c) { let a = []; for (let h = 0; h < c.length; h++) { let p = Number(c[h]); for (let d = 0; p || d < a.length; d++) p += (a[d] || 0) * 10, a[d] = p % 16, p = (p - a[d]) / 16 } return a } function no(c) { let a = $r(c) , h = Array(an); for (let p = 0; p < an; p++) h[an - 1 - p] = to(a, p * an, an); return h } var Hn = class c { constructor(a, h) { this.parts = a, this.str = h } static fromString(a) { return new c(no(a),a) } static fromBit(a) { let h = Array(an) , p = Math.floor(a / Vi); for (let d = 0; d < an; d++) h[an - 1 - d] = d === p ? 1 << a - p * Vi : 0; return new c(h) } and({parts: a}) { return new c(this.parts.map((h,p)=>h & a[p])) } or({parts: a}) { return new c(this.parts.map((h,p)=>h | a[p])) } xor({parts: a}) { return new c(this.parts.map((h,p)=>h ^ a[p])) } not() { return new c(this.parts.map(a=>~a)) } equals({parts: a}) { return this.parts.every((h,p)=>h === a[p]) } toString() { if (this.str != null) return this.str; let a = new Array(Yr / 4); return this.parts.forEach((h,p)=>{ let d = $r(h.toString()); for (let M = 0; M < 4; M++) a[M + p * 4] = d[4 - 1 - M] || 0 } ), this.str = Qa.fromArray(a, 16).toString() } toJSON() { return this.toString() } } , ln = eo(); ln && BigInt.prototype.toJSON == null && (BigInt.prototype.toJSON = function() { return this.toString() } ); var si = {} , Wr = ln ? function(a) { return BigInt(a) } : function(a) { return a instanceof Hn ? a : (typeof a == "number" && (a = a.toString()), si[a] != null || (si[a] = Hn.fromString(a)), si[a]) } , St = Wr(0) , gi = ln ? function(a=St, h=St) { return a & h } : function(a=St, h=St) { return a.and(h) } , Jr = ln ? function(a=St, h=St) { return a | h } : function(a=St, h=St) { return a.or(h) } , io = ln ? function(a=St, h=St) { return a ^ h } : function(a=St, h=St) { return a.xor(h) } , ro = ln ? function(a=St) { return ~a } : function(a=St) { return a.not() } , Xi = ln ? function(a, h) { return a === h } : function(a, h) { return a == null || h == null ? a == h : a.equals(h) } ; function so(...c) { let a = c[0]; for (let h = 1; h < c.length; h++) a = Jr(a, c[h]); return a } function ao(c, a) { return Xi(gi(c, a), a) } function oo(c, a) { return !Xi(gi(c, a), St) } function uo(c, a) { return a === St ? c : Jr(c, a) } function lo(c, a) { return a === St ? c : io(c, gi(c, a)) } var ho = ln ? function(a) { return BigInt(1) << BigInt(a) } : function(a) { return Hn.fromBit(a) } , co = { combine: so, add: uo, remove: lo, filter: gi, invert: ro, has: ao, hasAny: oo, equals: Xi, deserialize: Wr, getFlag: ho }, ci; (function(c) { c[c.CLOSE_NORMAL = 1e3] = "CLOSE_NORMAL", c[c.CLOSE_UNSUPPORTED = 1003] = "CLOSE_UNSUPPORTED", c[c.CLOSE_ABNORMAL = 1006] = "CLOSE_ABNORMAL", c[c.INVALID_CLIENTID = 4e3] = "INVALID_CLIENTID", c[c.INVALID_ORIGIN = 4001] = "INVALID_ORIGIN", c[c.RATELIMITED = 4002] = "RATELIMITED", c[c.TOKEN_REVOKED = 4003] = "TOKEN_REVOKED", c[c.INVALID_VERSION = 4004] = "INVALID_VERSION", c[c.INVALID_ENCODING = 4005] = "INVALID_ENCODING" } )(ci || (ci = {})); var jn; (function(c) { c[c.INVALID_PAYLOAD = 4e3] = "INVALID_PAYLOAD", c[c.INVALID_COMMAND = 4002] = "INVALID_COMMAND", c[c.INVALID_EVENT = 4004] = "INVALID_EVENT", c[c.INVALID_PERMISSIONS = 4006] = "INVALID_PERMISSIONS" } )(jn || (jn = {})); var Fi; (function(c) { c.LANDSCAPE = "landscape", c.PORTRAIT = "portrait" } )(Fi || (Fi = {})); var gn; (function(c) { c.MOBILE = "mobile", c.DESKTOP = "desktop" } )(gn || (gn = {})); var ju = Object.freeze({ CREATE_INSTANT_INVITE: co.getFlag(0) }); function pt(c) { return qr(a=>{ var h; let[p] = (h = Object.entries(c).find(([,d])=>d === a)) !== null && h !== void 0 ? h : []; return a != null && p === void 0 ? c.UNHANDLED : a } , j().or(fe())) } var Xr = "DISPATCH", ge; (function(c) { c.AUTHORIZE = "AUTHORIZE", c.AUTHENTICATE = "AUTHENTICATE", c.GET_GUILDS = "GET_GUILDS", c.GET_GUILD = "GET_GUILD", c.GET_CHANNEL = "GET_CHANNEL", c.GET_CHANNELS = "GET_CHANNELS", c.SET_USER_VOICE_SETTINGS = "SET_USER_VOICE_SETTINGS", c.SELECT_VOICE_CHANNEL = "SELECT_VOICE_CHANNEL", c.GET_SELECTED_VOICE_CHANNEL = "GET_SELECTED_VOICE_CHANNEL", c.SELECT_TEXT_CHANNEL = "SELECT_TEXT_CHANNEL", c.GET_VOICE_SETTINGS = "GET_VOICE_SETTINGS", c.SET_VOICE_SETTINGS = "SET_VOICE_SETTINGS", c.SUBSCRIBE = "SUBSCRIBE", c.UNSUBSCRIBE = "UNSUBSCRIBE", c.CAPTURE_SHORTCUT = "CAPTURE_SHORTCUT", c.SET_CERTIFIED_DEVICES = "SET_CERTIFIED_DEVICES", c.SET_ACTIVITY = "SET_ACTIVITY", c.GET_SKUS = "GET_SKUS", c.GET_ENTITLEMENTS = "GET_ENTITLEMENTS", c.GET_SKUS_EMBEDDED = "GET_SKUS_EMBEDDED", c.GET_ENTITLEMENTS_EMBEDDED = "GET_ENTITLEMENTS_EMBEDDED", c.START_PURCHASE = "START_PURCHASE", c.START_PREMIUM_PURCHASE = "START_PREMIUM_PURCHASE", c.SET_CONFIG = "SET_CONFIG", c.SEND_ANALYTICS_EVENT = "SEND_ANALYTICS_EVENT", c.USER_SETTINGS_GET_LOCALE = "USER_SETTINGS_GET_LOCALE", c.OPEN_EXTERNAL_LINK = "OPEN_EXTERNAL_LINK", c.ENCOURAGE_HW_ACCELERATION = "ENCOURAGE_HW_ACCELERATION", c.CAPTURE_LOG = "CAPTURE_LOG", c.SET_ORIENTATION_LOCK_STATE = "SET_ORIENTATION_LOCK_STATE", c.OPEN_INVITE_DIALOG = "OPEN_INVITE_DIALOG", c.GET_PLATFORM_BEHAVIORS = "GET_PLATFORM_BEHAVIORS", c.GET_CHANNEL_PERMISSIONS = "GET_CHANNEL_PERMISSIONS", c.OPEN_SHARE_MOMENT_DIALOG = "OPEN_SHARE_MOMENT_DIALOG", c.INITIATE_IMAGE_UPLOAD = "INITIATE_IMAGE_UPLOAD" } )(ge || (ge = {})); var Dn = he({ cmd: j(), data: Zn(), evt: Wi(), nonce: j() }).passthrough() , Qr = { UNHANDLED: -1, bot: "bot", rpc: "rpc", identify: "identify", connections: "connections", email: "email", guilds: "guilds", "guilds.join": "guilds.join", "guilds.members.read": "guilds.members.read", "gdm.join": "gdm.join", "messages.read": "messages.read", "rpc.notifications.read": "rpc.notifications.read", "rpc.voice.write": "rpc.voice.write", "rpc.voice.read": "rpc.voice.read", "rpc.activities.write": "rpc.activities.write", "webhook.incoming": "webhook.incoming", "applications.builds.upload": "applications.builds.upload", "applications.builds.read": "applications.builds.read", "applications.store.update": "applications.store.update", "applications.entitlements": "applications.entitlements", "relationships.read": "relationships.read", "activities.read": "activities.read", "activities.write": "activities.write" } , es = pt(Qr) , qt = he({ id: j(), username: j(), discriminator: j(), avatar: j().optional().nullable(), publicFlags: fe().optional().nullable() }) , vi = he({ user: qt, nick: j().optional().nullable(), roles: Be(j()), joined_at: j(), deaf: Ae(), mute: Ae() }) , mi = he({ id: j(), name: j().optional().nullable(), roles: Be(j()).optional().nullable(), user: qt.optional().nullable(), require_colons: Ae().optional().nullable(), managed: Ae().optional().nullable(), animated: Ae().optional().nullable(), available: Ae().optional().nullable() }) , yi = he({ mute: Ae(), deaf: Ae(), self_mute: Ae(), self_deaf: Ae(), suppress: Ae() }) , ts = he({ mute: Ae(), nick: j(), user: qt, voice_state: yi, volume: fe() }) , ns = { UNHANDLED: -1, IDLE: "idle", DND: "dnd", ONLINE: "online", OFFLINE: "offline" } , Un = pt(ns) , xn = he({ name: j(), type: fe(), url: j().optional().nullable(), created_at: fe().optional().nullable(), timestamps: he({ start: fe(), end: fe() }).partial().optional().nullable(), application_id: j().optional().nullable(), details: j().optional().nullable(), state: j().optional().nullable(), emoji: mi.optional().nullable(), party: he({ id: j().optional().nullable(), size: Be(fe()).optional().nullable() }).optional().nullable(), assets: he({ large_image: j().nullable(), large_text: j().nullable(), small_image: j().nullable(), small_text: j().nullable() }).partial().optional().nullable(), secrets: he({ join: j(), match: j() }).partial().optional().nullable(), instance: Ae().optional().nullable(), flags: fe().optional().nullable() }) , is = { UNHANDLED: -1, ROLE: 0, MEMBER: 1 } , rs = he({ id: j(), type: pt(is), allow: j(), deny: j() }) , wi = { UNHANDLED: -1, DM: 1, GROUP_DM: 3, GUILD_TEXT: 0, GUILD_VOICE: 2, GUILD_CATEGORY: 4, GUILD_ANNOUNCEMENT: 5, GUILD_STORE: 6, ANNOUNCEMENT_THREAD: 10, PUBLIC_THREAD: 11, PRIVATE_THREAD: 12, GUILD_STAGE_VOICE: 13, GUILD_DIRECTORY: 14, GUILD_FORUM: 15 } , Qi = he({ id: j(), type: pt(wi), guild_id: j().optional().nullable(), position: fe().optional().nullable(), permission_overwrites: Be(rs).optional().nullable(), name: j().optional().nullable(), topic: j().optional().nullable(), nsfw: Ae().optional().nullable(), last_message_id: j().optional().nullable(), bitrate: fe().optional().nullable(), user_limit: fe().optional().nullable(), rate_limit_per_user: fe().optional().nullable(), recipients: Be(qt).optional().nullable(), icon: j().optional().nullable(), owner_id: j().optional().nullable(), application_id: j().optional().nullable(), parent_id: j().optional().nullable(), last_pin_timestamp: j().optional().nullable() }) , ss = he({ user: qt, guild_id: j(), status: Un, activities: Be(xn), client_status: he({ desktop: Un, mobile: Un, web: Un }).partial() }) , as = he({ id: j(), name: j(), color: fe(), hoist: Ae(), position: fe(), permissions: j(), managed: Ae(), mentionable: Ae() }) , os = he({ id: j(), name: j(), owner_id: j(), icon: j().nullable(), icon_hash: j().optional().nullable(), splash: j().nullable(), discovery_splash: j().nullable(), owner: Ae().optional().nullable(), permissions: j().optional().nullable(), region: j(), afk_channel_id: j().nullable(), afk_timeout: fe(), widget_enabled: Ae().optional().nullable(), widget_channel_id: j().optional().nullable(), verification_level: fe(), default_message_notifications: fe(), explicit_content_filter: fe(), roles: Be(as), emojis: Be(mi), features: Be(j()), mfa_level: fe(), application_id: j().nullable(), system_channel_id: j().nullable(), system_channel_flags: fe(), rules_channel_id: j().nullable(), joined_at: j().optional().nullable(), large: Ae().optional().nullable(), unavailable: Ae().optional().nullable(), member_count: fe().optional().nullable(), voice_states: Be(yi).optional().nullable(), members: Be(vi).optional().nullable(), channels: Be(Qi).optional().nullable(), presences: Be(ss).optional().nullable(), max_presences: fe().optional().nullable(), max_members: fe().optional().nullable(), vanity_url_code: j().nullable(), description: j().nullable(), banner: j().nullable(), premium_tier: fe(), premium_subscription_count: fe().optional().nullable(), preferred_locale: j(), public_updates_channel_id: j().nullable(), max_video_channel_users: fe().optional().nullable(), approximate_member_count: fe().optional().nullable(), approximate_presence_count: fe().optional().nullable() }) , us = he({ id: j(), guild_id: j(), type: fe(), name: j() }) , ls = he({ id: j(), filename: j(), size: fe(), url: j(), proxy_url: j(), height: fe().optional().nullable(), width: fe().optional().nullable() }) , hs = he({ text: j(), icon_url: j().optional().nullable(), proxy_icon_url: j().optional().nullable() }) , fi = he({ url: j().optional().nullable(), proxy_url: j().optional().nullable(), height: fe().optional().nullable(), width: fe().optional().nullable() }) , cs = fi.omit({ proxy_url: !0 }) , fs = he({ name: j().optional().nullable(), url: j().optional().nullable() }) , ds = he({ name: j().optional().nullable(), url: j().optional().nullable(), icon_url: j().optional().nullable(), proxy_icon_url: j().optional().nullable() }) , ps = he({ name: j(), value: j(), inline: Ae() }) , _s = he({ title: j().optional().nullable(), type: j().optional().nullable(), description: j().optional().nullable(), url: j().optional().nullable(), timestamp: j().optional().nullable(), color: fe().optional().nullable(), footer: hs.optional().nullable(), image: fi.optional().nullable(), thumbnail: fi.optional().nullable(), video: cs.optional().nullable(), provider: fs.optional().nullable(), author: ds.optional().nullable(), fields: Be(ps).optional().nullable() }) , gs = he({ count: fe(), me: Ae(), emoji: mi }) , vs = he({ type: fe(), party_id: j().optional().nullable() }) , ms = he({ id: j(), cover_image: j().optional().nullable(), description: j(), icon: j().optional().nullable(), name: j() }) , ys = he({ message_id: j().optional().nullable(), channel_id: j().optional().nullable(), guild_id: j().optional().nullable() }) , bi = he({ id: j(), channel_id: j(), guild_id: j().optional().nullable(), author: qt.optional().nullable(), member: vi.optional().nullable(), content: j(), timestamp: j(), edited_timestamp: j().optional().nullable(), tts: Ae(), mention_everyone: Ae(), mentions: Be(qt), mention_roles: Be(j()), mention_channels: Be(us), attachments: Be(ls), embeds: Be(_s), reactions: Be(gs).optional().nullable(), nonce: Ji([j(), fe()]).optional().nullable(), pinned: Ae(), webhook_id: j().optional().nullable(), type: fe(), activity: vs.optional().nullable(), application: ms.optional().nullable(), message_reference: ys.optional().nullable(), flags: fe().optional().nullable(), stickers: Be(Zn()).optional().nullable(), referenced_message: Zn().optional().nullable() }) , ws = he({ id: j(), name: j() }) , bs = { UNHANDLED: -1, KEYBOARD_KEY: 0, MOUSE_BUTTON: 1, KEYBOARD_MODIFIER_KEY: 2, GAMEPAD_BUTTON: 3 } , Si = he({ type: pt(bs), code: fe(), name: j() }) , Ss = { UNHANDLED: -1, PUSH_TO_TALK: "PUSH_TO_TALK", VOICE_ACTIVITY: "VOICE_ACTIVITY" } , Es = he({ type: pt(Ss), auto_threshold: Ae(), threshold: fe(), shortcut: Be(Si), delay: fe() }) , Gi = he({ device_id: j(), volume: fe(), available_devices: Be(ws) }) , Ts = { UNHANDLED: -1, AUDIO_INPUT: "AUDIO_INPUT", AUDIO_OUTPUT: "AUDIO_OUTPUT", VIDEO_INPUT: "VIDEO_INPUT" } , fo = he({ type: pt(Ts), id: j(), vendor: he({ name: j(), url: j() }), model: he({ name: j(), url: j() }), related: Be(j()), echo_cancellation: Ae().optional().nullable(), noise_suppression: Ae().optional().nullable(), automatic_gain_control: Ae().optional().nullable(), hardware_mute: Ae().optional().nullable() }) , Is = { UNHANDLED: -1, APPLICATION: 1, DLC: 2, CONSUMABLE: 3, BUNDLE: 4, SUBSCRIPTION: 5 } , Cs = he({ id: j(), name: j(), type: pt(Is), price: he({ amount: fe(), currency: j() }), application_id: j(), flags: fe(), release_date: j().nullable() }) , As = { UNHANDLED: -1, PURCHASE: 1, PREMIUM_SUBSCRIPTION: 2, DEVELOPER_GIFT: 3, TEST_MODE_PURCHASE: 4, FREE_PURCHASE: 5, USER_GIFT: 6, PREMIUM_PURCHASE: 7 } , Ei = he({ id: j(), sku_id: j(), application_id: j(), user_id: j(), gift_code_flags: fe(), type: pt(As), gifter_user_id: j().optional().nullable(), branches: Be(j()).optional().nullable(), starts_at: j().optional().nullable(), ends_at: j().optional().nullable(), parent_id: j().optional().nullable(), consumed: Ae().optional().nullable(), deleted: Ae().optional().nullable(), gift_code_batch_id: j().optional().nullable() }) , Ps = { UNHANDLED: -1, UNLOCKED: 1, PORTRAIT: 2, LANDSCAPE: 3 } , po = pt(Ps) , Os = { UNHANDLED: -1, NOMINAL: 0, FAIR: 1, SERIOUS: 2, CRITICAL: 3 } , xs = pt(Os) , er = { UNHANDLED: -1, PORTRAIT: 0, LANDSCAPE: 1 } , _o = pt(er) , qn = { UNHANDLED: -1, FOCUSED: 0, PIP: 1, GRID: 2 } , go = pt(qn) , vo = Object.freeze({ __proto__: null, DISPATCH: Xr, get Commands() { return ge }, ReceiveFramePayload: Dn, ScopesObject: Qr, Scopes: es, User: qt, GuildMember: vi, Emoji: mi, VoiceState: yi, UserVoiceState: ts, StatusObject: ns, Status: Un, Activity: xn, PermissionOverwriteTypeObject: is, PermissionOverwrite: rs, ChannelTypesObject: wi, Channel: Qi, PresenceUpdate: ss, Role: as, Guild: os, ChannelMention: us, Attachment: ls, EmbedFooter: hs, Image: fi, Video: cs, EmbedProvider: fs, EmbedAuthor: ds, EmbedField: ps, Embed: _s, Reaction: gs, MessageActivity: vs, MessageApplication: ms, MessageReference: ys, Message: bi, VoiceDevice: ws, KeyTypesObject: bs, ShortcutKey: Si, VoiceSettingModeTypeObject: Ss, VoiceSettingsMode: Es, VoiceSettingsIO: Gi, CertifiedDeviceTypeObject: Ts, CertifiedDevice: fo, SkuTypeObject: Is, Sku: Cs, EntitlementTypesObject: As, Entitlement: Ei, OrientationLockStateTypeObject: Ps, OrientationLockState: po, ThermalStateTypeObject: Os, ThermalState: xs, OrientationTypeObject: er, Orientation: _o, LayoutModeTypeObject: qn, LayoutMode: go }) , mn = he({}).nullable() , Ns = he({ code: j() }) , Ls = he({ access_token: j(), user: he({ username: j(), discriminator: j(), id: j(), avatar: j().nullable(), public_flags: fe() }), scopes: Be(es), expires: j(), application: he({ description: j(), icon: j().nullable(), id: j(), rpc_origins: Be(j()).optional(), name: j() }) }) , mo = he({ guilds: Be(he({ id: j(), name: j() })) }) , yo = he({ id: j(), name: j(), icon_url: j().optional(), members: Be(vi) }) , Kn = he({ id: j(), type: pt(wi), guild_id: j().optional().nullable(), name: j().optional().nullable(), topic: j().optional().nullable(), bitrate: fe().optional().nullable(), user_limit: fe().optional().nullable(), position: fe().optional().nullable(), voice_states: Be(ts), messages: Be(bi) }) , wo = he({ channels: Be(Qi) }) , Ms = he({ user_id: j(), pan: he({ left: fe(), right: fe() }).optional(), volume: fe().optional(), mute: Ae().optional() }) , qu = Kn.nullable() , bo = Kn.nullable() , Rs = Kn.nullable() , So = Kn.nullable() , tr = he({ input: Gi, output: Gi, mode: Es, automatic_gain_control: Ae(), echo_cancellation: Ae(), noise_suppression: Ae(), qos: Ae(), silence_warning: Ae(), deaf: Ae(), mute: Ae() }) , Eo = he({ evt: j() }) , To = he({ shortcut: Si }) , Ds = xn , ks = he({ skus: Be(Cs) }) , Bs = he({ entitlements: Be(Ei) }) , Us = Be(Ei).nullable() , zs = he({ use_interactive_pip: Ae() }) , Vs = he({ locale: j() }) , Fs = he({ enabled: Ae() }) , Gs = he({ permissions: Hr().or(j()) }) , Zs = he({ image_url: j() }).nullable() , Hs = he({ iosKeyboardResizesView: jr(Ae()) }) , Io = Dn.extend({ cmd: Rn(ge), evt: Wi() }); function Co({cmd: c, data: a}) { switch (c) { case ge.AUTHENTICATE: return Ls.parse(a); case ge.AUTHORIZE: return Ns.parse(a); case ge.CAPTURE_SHORTCUT: return To.parse(a); case ge.ENCOURAGE_HW_ACCELERATION: return Fs.parse(a); case ge.GET_CHANNEL: return Kn.parse(a); case ge.GET_CHANNELS: return wo.parse(a); case ge.GET_CHANNEL_PERMISSIONS: return Gs.parse(a); case ge.GET_GUILD: return yo.parse(a); case ge.GET_GUILDS: return mo.parse(a); case ge.GET_PLATFORM_BEHAVIORS: return Hs.parse(a); case ge.GET_SELECTED_VOICE_CHANNEL: return Rs.parse(a); case ge.GET_VOICE_SETTINGS: case ge.SET_VOICE_SETTINGS: return tr.parse(a); case ge.SELECT_TEXT_CHANNEL: return So.parse(a); case ge.SELECT_VOICE_CHANNEL: return bo.parse(a); case ge.SET_ACTIVITY: return Ds.parse(a); case ge.GET_SKUS_EMBEDDED: return ks.parse(a); case ge.GET_ENTITLEMENTS_EMBEDDED: return Bs.parse(a); case ge.SET_CONFIG: return zs.parse(a); case ge.SET_USER_VOICE_SETTINGS: return Ms.parse(a); case ge.START_PURCHASE: return Us.parse(a); case ge.SUBSCRIBE: case ge.UNSUBSCRIBE: return Eo.parse(a); case ge.USER_SETTINGS_GET_LOCALE: return Vs.parse(a); case ge.INITIATE_IMAGE_UPLOAD: return Zs.parse(a); case ge.START_PREMIUM_PURCHASE: case ge.OPEN_EXTERNAL_LINK: case ge.SET_ORIENTATION_LOCK_STATE: case ge.SET_CERTIFIED_DEVICES: case ge.SEND_ANALYTICS_EVENT: case ge.OPEN_INVITE_DIALOG: case ge.CAPTURE_LOG: case ge.OPEN_SHARE_MOMENT_DIALOG: return mn.parse(a); default: throw new Error(`Unrecognized command ${c}`) } } function Ao(c) { return Object.assign(Object.assign({}, c), { data: Co(c) }) } var nr = "ERROR", _e; (function(c) { c.READY = "READY", c.GUILD_STATUS = "GUILD_STATUS", c.GUILD_CREATE = "GUILD_CREATE", c.CHANNEL_CREATE = "CHANNEL_CREATE", c.VOICE_CHANNEL_SELECT = "VOICE_CHANNEL_SELECT", c.VOICE_SETTINGS_UPDATE = "VOICE_SETTINGS_UPDATE", c.VOICE_STATE_CREATE = "VOICE_STATE_CREATE", c.VOICE_STATE_UPDATE = "VOICE_STATE_UPDATE", c.VOICE_STATE_DELETE = "VOICE_STATE_DELETE", c.VOICE_CONNECTION_STATUS = "VOICE_CONNECTION_STATUS", c.MESSAGE_CREATE = "MESSAGE_CREATE", c.MESSAGE_UPDATE = "MESSAGE_UPDATE", c.MESSAGE_DELETE = "MESSAGE_DELETE", c.SPEAKING_START = "SPEAKING_START", c.SPEAKING_STOP = "SPEAKING_STOP", c.NOTIFICATION_CREATE = "NOTIFICATION_CREATE", c.CAPTURE_SHORTCUT_CHANGE = "CAPTURE_SHORTCUT_CHANGE", c.ACTIVITY_JOIN = "ACTIVITY_JOIN", c.ACTIVITY_JOIN_REQUEST = "ACTIVITY_JOIN_REQUEST", c.ACTIVITY_PIP_MODE_UPDATE = "ACTIVITY_PIP_MODE_UPDATE", c.ACTIVITY_LAYOUT_MODE_UPDATE = "ACTIVITY_LAYOUT_MODE_UPDATE", c.ORIENTATION_UPDATE = "ORIENTATION_UPDATE", c.CURRENT_USER_UPDATE = "CURRENT_USER_UPDATE", c.ENTITLEMENT_CREATE = "ENTITLEMENT_CREATE", c.THERMAL_STATE_UPDATE = "THERMAL_STATE_UPDATE" } )(_e || (_e = {})); var js = Dn.extend({ evt: zt(nr), data: he({ code: fe(), message: j().optional() }).passthrough(), cmd: Rn(ge), nonce: j().nullable() }) , ir = Dn.extend({ evt: Rn(_e), nonce: j().nullable(), cmd: zt(Xr), data: he({}).passthrough() }) , Po = ir.extend({ evt: j() }) , Oo = Ji([ir, Po, js]); function at(c, a) { return ir.extend({ evt: zt(c), data: he(a) }) } var xo = at(_e.READY, { v: fe(), config: he({ cdn_host: j().optional(), api_endpoint: j(), environment: j() }), user: he({ id: j(), username: j(), discriminator: j(), avatar: j().optional() }).optional() }) , No = at(_e.GUILD_STATUS, { guild: os, online: fe().optional() }) , Lo = at(_e.GUILD_CREATE, { id: j(), name: j() }) , Mo = at(_e.CHANNEL_CREATE, { id: j(), name: j(), type: pt(wi) }) , Ro = at(_e.VOICE_CHANNEL_SELECT, { channel_id: j().nullable(), guild_id: j().nullable().optional() }) , Do = at(_e.VOICE_STATE_UPDATE, { data: tr }) , rr = at(_e.VOICE_STATE_CREATE, { voice_state: yi, user: qt, nick: j(), volume: fe(), mute: Ae(), pan: he({ left: fe(), right: fe() }) }) , ko = rr.extend({ evt: zt(_e.VOICE_STATE_UPDATE) }) , Bo = rr.extend({ evt: zt(_e.VOICE_STATE_DELETE) }) , Uo = { UNHANDLED: -1, DISCONNECTED: "DISCONNECTED", AWAITING_ENDPOINT: "AWAITING_ENDPOINT", AUTHENTICATING: "AUTHENTICATING", CONNECTING: "CONNECTING", CONNECTED: "CONNECTED", VOICE_DISCONNECTED: "VOICE_DISCONNECTED", VOICE_CONNECTING: "VOICE_CONNECTING", VOICE_CONNECTED: "VOICE_CONNECTED", NO_ROUTE: "NO_ROUTE", ICE_CHECKING: "ICE_CHECKING" } , zo = at(_e.VOICE_CONNECTION_STATUS, { state: pt(Uo), hostname: j(), pings: Be(fe()), average_ping: fe(), last_ping: fe() }) , sr = at(_e.MESSAGE_CREATE, { channel_id: j(), message: bi }) , Vo = sr.extend({ evt: zt(_e.MESSAGE_UPDATE) }) , Fo = sr.extend({ evt: zt(_e.MESSAGE_DELETE) }) , Go = at(_e.SPEAKING_START, { user_id: j() }) , Zo = at(_e.SPEAKING_STOP, { user_id: j() }) , Ho = at(_e.NOTIFICATION_CREATE, { channel_id: j(), message: bi, icon_url: j(), title: j(), body: j() }) , jo = at(_e.CAPTURE_SHORTCUT_CHANGE, { shortcut: Si }) , qo = { UNHANDLED: -1, PLAY: 0, SPECTATE: 1 } , Ko = at(_e.ACTIVITY_JOIN, { secret: j(), intent: pt(qo).optional() }) , Yo = at(_e.ACTIVITY_JOIN_REQUEST, { user: qt }) , $o = at(_e.ACTIVITY_PIP_MODE_UPDATE, { is_pip_mode: Ae() }) , Wo = at(_e.ACTIVITY_LAYOUT_MODE_UPDATE, { layout_mode: pt(qn) }) , Jo = at(_e.ORIENTATION_UPDATE, { screen_orientation: pt(er), orientation: Rn(Fi) }) , Xo = at(_e.CURRENT_USER_UPDATE, { avatar: j().optional().nullable(), bot: Ae(), discriminator: j(), flags: fe().optional().nullable(), id: j(), premium_type: fe().optional().nullable(), username: j() }) , Qo = at(_e.ENTITLEMENT_CREATE, { entitlement: Ei }) , eu = at(_e.THERMAL_STATE_UPDATE, { thermal_state: xs }); function tu(c) { switch (c.evt) { case _e.ACTIVITY_JOIN: return Ko.parse(c); case _e.ACTIVITY_JOIN_REQUEST: return Yo.parse(c); case _e.ACTIVITY_PIP_MODE_UPDATE: return $o.parse(c); case _e.ACTIVITY_LAYOUT_MODE_UPDATE: return Wo.parse(c); case _e.CAPTURE_SHORTCUT_CHANGE: return jo.parse(c); case _e.CHANNEL_CREATE: return Mo.parse(c); case nr: return js.parse(c); case _e.GUILD_CREATE: return Lo.parse(c); case _e.GUILD_STATUS: return No.parse(c); case _e.MESSAGE_CREATE: return sr.parse(c); case _e.MESSAGE_DELETE: return Fo.parse(c); case _e.MESSAGE_UPDATE: return Vo.parse(c); case _e.NOTIFICATION_CREATE: return Ho.parse(c); case _e.ORIENTATION_UPDATE: return Jo.parse(c); case _e.READY: return xo.parse(c); case _e.SPEAKING_START: return Go.parse(c); case _e.SPEAKING_STOP: return Zo.parse(c); case _e.VOICE_CHANNEL_SELECT: return Ro.parse(c); case _e.VOICE_CONNECTION_STATUS: return zo.parse(c); case _e.VOICE_SETTINGS_UPDATE: return Do.parse(c); case _e.VOICE_STATE_CREATE: return rr.parse(c); case _e.VOICE_STATE_DELETE: return Bo.parse(c); case _e.VOICE_STATE_UPDATE: return ko.parse(c); case _e.CURRENT_USER_UPDATE: return Xo.parse(c); case _e.ENTITLEMENT_CREATE: return Qo.parse(c); case _e.THERMAL_STATE_UPDATE: return eu.parse(c); default: throw new Error(`Unrecognized event type ${c.evt}`) } } he({ frame_id: j(), platform: Rn(gn).optional().nullable() }); he({ v: zt(1), encoding: zt("json").optional(), client_id: j(), frame_id: j() }); var nu = he({ code: fe(), message: j().optional() }) , iu = he({ evt: j().nullable(), nonce: j().nullable(), data: Zn().nullable(), cmd: j() }).passthrough(); function ru(c) { let a = iu.parse(c); return a.evt != null ? tu(Oo.parse(a)) : Ao(Io.passthrough().parse(a)) } function ht(c, a, h, p=()=>{} ) { let d = Dn.extend({ cmd: zt(a), data: h }); return M=>_n(this, void 0, void 0, function*() { let F = yield c({ cmd: a, args: M, transfer: p(M) }); return d.parse(F).data }) } var su = c=>ht(c, ge.AUTHENTICATE, Ls) , au = c=>ht(c, ge.AUTHORIZE, Ns) , ou = c=>ht(c, ge.CAPTURE_LOG, mn) , uu = c=>ht(c, ge.ENCOURAGE_HW_ACCELERATION, Fs) , lu = c=>ht(c, ge.GET_ENTITLEMENTS_EMBEDDED, Bs) , hu = c=>ht(c, ge.GET_SELECTED_VOICE_CHANNEL, Rs) , cu = c=>ht(c, ge.GET_SKUS_EMBEDDED, ks) , fu = c=>ht(c, ge.GET_VOICE_SETTINGS, tr) , du = c=>ht(c, ge.GET_CHANNEL_PERMISSIONS, Gs) , pu = c=>ht(c, ge.GET_PLATFORM_BEHAVIORS, Hs) , _u = c=>ht(c, ge.OPEN_EXTERNAL_LINK, mn) , gu = c=>ht(c, ge.OPEN_INVITE_DIALOG, mn) , vu = c=>ht(c, ge.OPEN_SHARE_MOMENT_DIALOG, mn); xn.pick({ state: !0, details: !0, timestamps: !0, assets: !0, party: !0, secrets: !0, buttons: !0, instance: !0, supported_platforms: !0, type: !0 }).extend({ type: xn.shape.type.optional(), instance: xn.shape.instance.optional() }).nullable(); var mu = c=>ht(c, ge.SET_ACTIVITY, Ds) , yu = c=>ht(c, ge.SET_CONFIG, zs); function wu({sendCommand: c, cmd: a, response: h, fallbackTransform: p, transferTransform: d=()=>{} }) { let M = Dn.extend({ cmd: zt(a), data: h }); return F=>_n(this, void 0, void 0, function*() { try { let Z = yield c({ cmd: a, args: F, transfer: d(F) }); return M.parse(Z).data } catch (Z) { if (Z.code === jn.INVALID_PAYLOAD) { let q = p(F) , k = yield c({ cmd: a, args: q, transfer: d(q) }); return M.parse(k).data } else throw Z } }) } var bu = c=>({ lock_state: c.lock_state, picture_in_picture_lock_state: c.picture_in_picture_lock_state }) , Su = c=>wu({ sendCommand: c, cmd: ge.SET_ORIENTATION_LOCK_STATE, response: mn, fallbackTransform: bu }) , Eu = c=>ht(c, ge.SET_USER_VOICE_SETTINGS, Ms) , Tu = c=>ht(c, ge.START_PREMIUM_PURCHASE, mn) , Iu = c=>ht(c, ge.START_PURCHASE, Us) , Cu = c=>ht(c, ge.USER_SETTINGS_GET_LOCALE, Vs) , Au = c=>ht(c, ge.INITIATE_IMAGE_UPLOAD, Zs); function Pu(c) { return { authenticate: su(c), authorize: au(c), captureLog: ou(c), encourageHardwareAcceleration: uu(c), getChannelPermissions: du(c), getEntitlements: lu(c), getPlatformBehaviors: pu(c), getSelectedVoiceChannel: hu(c), getSkus: cu(c), getVoiceSettings: fu(c), openExternalLink: _u(c), openInviteDialog: gu(c), openShareMomentDialog: vu(c), setActivity: mu(c), setConfig: yu(c), setOrientationLockState: Su(c), setUserVoiceSettings: Eu(c), startPremiumPurchase: Tu(c), startPurchase: Iu(c), userSettingsGetLocale: Cu(c), initiateImageUpload: Au(c) } } var ai, Ou = new Uint8Array(16); function xu() { if (!ai && (ai = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto < "u" && typeof msCrypto.getRandomValues == "function" && msCrypto.getRandomValues.bind(msCrypto), !ai)) throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); return ai(Ou) } var Nu = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; function Lu(c) { return typeof c == "string" && Nu.test(c) } var bt = []; for (oi = 0; oi < 256; ++oi) bt.push((oi + 256).toString(16).substr(1)); var oi; function Mu(c) { var a = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0 , h = (bt[c[a + 0]] + bt[c[a + 1]] + bt[c[a + 2]] + bt[c[a + 3]] + "-" + bt[c[a + 4]] + bt[c[a + 5]] + "-" + bt[c[a + 6]] + bt[c[a + 7]] + "-" + bt[c[a + 8]] + bt[c[a + 9]] + "-" + bt[c[a + 10]] + bt[c[a + 11]] + bt[c[a + 12]] + bt[c[a + 13]] + bt[c[a + 14]] + bt[c[a + 15]]).toLowerCase(); if (!Lu(h)) throw TypeError("Stringified UUID is invalid"); return h } function Tr(c, a, h) { c = c || {}; var p = c.random || (c.rng || xu)(); if (p[6] = p[6] & 15 | 64, p[8] = p[8] & 63 | 128, a) { h = h || 0; for (var d = 0; d < 16; ++d) a[h + d] = p[d]; return a } return Mu(p) } var Zi = class extends Error { constructor(a, h="") { super(h), this.code = a, this.message = h, this.name = "Discord SDK Error" } } , qs = /\{([a-z]+)\}/g; function Ru(c) { let a = c.replace(qs, (h,p)=>`(?<${p}>[\\w-]+)`); return new RegExp(`${a}(/|$)`) } function Du({originalURL: c, prefix: a, prefixHost: h, target: p}) { let d = new URL(`https://${p}`) , M = Ru(d.host) , F = c.toString().match(M); if (F == null) return c; let Z = new URL(c.toString()); return Z.host = h, Z.pathname = a.replace(qs, (q,k)=>{ var O; let B = (O = F.groups) === null || O === void 0 ? void 0 : O[k]; if (B == null) throw new Error("Misconfigured route."); return B } ), Z.pathname += Z.pathname === "/" ? c.pathname.slice(1) : c.pathname, Z.pathname = Z.pathname.replace(d.pathname, ""), Z.pathname += Z.pathname.endsWith("/") ? "" : "/", Z } function Di(c, a=window.location.protocol, h=window.location.host) { return c.startsWith("/") ? new URL(`${a}//${h}${c}`) : new URL(c) } function ki({url: c, mappings: a}) { for (let h of a) { let p = Du({ originalURL: c, prefix: h.prefix, target: h.target, prefixHost: window.location.host }); if (p) return p } return c } function ku(c, a) { let h = window.fetch; window.fetch = function(M, F) { let Z = ki({ url: Di(M.toString()), mappings: a }); return h(Z.toString(), F) } ; let p = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(M, F, Z, q, k) { let O = ki({ url: Di(F), mappings: a }); p.apply(this, [M, O.toString(), Z, q, k]) } ; class d extends WebSocket { constructor(F, Z) { let q = F instanceof URL ? F.toString() : F , k = ki({ url: Di(q, "wss:"), mappings: a }); super(k.toString(), Z) } } window.WebSocket = d } function Bu() { return { disableConsoleLogOverride: !1 } } var Uu = ["log", "warn", "debug", "info", "error"]; function zu(c, a, h) { let p = c[a] , d = c; p && (c[a] = function() { let M = [].slice.call(arguments) , F = "" + M.join(" "); h(a, F), p.apply(d, M) } ) } var Xt; (function(c) { c[c.HANDSHAKE = 0] = "HANDSHAKE", c[c.FRAME = 1] = "FRAME", c[c.CLOSE = 2] = "CLOSE", c[c.HELLO = 3] = "HELLO" } )(Xt || (Xt = {})); var Vu = new Set([window.location.origin, "https://discord.com", "https://discordapp.com", "https://ptb.discord.com", "https://ptb.discordapp.com", "https://canary.discord.com", "https://canary.discordapp.com", "https://staging.discord.co", "http://localhost:3333", "https://pax.discord.com", "null"]); function Fu() { var c; return [(c = window.parent.opener) !== null && c !== void 0 ? c : window.parent, document.referrer ? document.referrer : "*"] } var di = class { constructor(a, h) { this.eventBus = new Ea, this.source = null, this.sourceOrigin = "", this.pendingCommands = new Map, this.layoutModeUpdateListenerMap = new Map, this.sendCommand = Z=>{ var q; if (this.source == null) throw new Error("Attempting to send message before initialization"); let k = Tr(); return (q = this.source) === null || q === void 0 || q.postMessage([Xt.FRAME, Object.assign(Object.assign({}, Z), { nonce: k })], this.sourceOrigin, this.getTransfer(Z)), new Promise((B,C)=>{ this.pendingCommands.set(k, { resolve: B, reject: C }) } ) } , this.commands = Pu(this.sendCommand), this.initializeNetworkShims = ku, this.handleMessage = Z=>{ if (!Vu.has(Z.origin)) return; let q = Z.data; if (!Array.isArray(q)) return; let[k,O] = q; switch (k) { case Xt.HELLO: return; case Xt.CLOSE: return this.handleClose(O); case Xt.HANDSHAKE: return this.handleHandshake(); case Xt.FRAME: return this.handleFrame(O); default: throw new Error("Invalid message format") } } , this.isReady = !1, this.clientId = a, this.configuration = h ?? Bu(), window.addEventListener("message", this.handleMessage); let p = new URLSearchParams(window.location.search) , d = p.get("frame_id"); if (!d) throw new Error("frame_id query param is not defined"); this.frameId = d; let M = p.get("instance_id"); if (!M) throw new Error("instance_id query param is not defined"); this.instanceId = M; let F = p.get("platform"); if (F) { if (F !== gn.DESKTOP && F !== gn.MOBILE) throw new Error(`Invalid query param "platform" of "${F}". Valid values are "${gn.DESKTOP}" or "${gn.MOBILE}"`) } else throw new Error("platform query param is not defined"); this.platform = F, this.guildId = p.get("guild_id"), this.channelId = p.get("channel_id"), [this.source,this.sourceOrigin] = Fu(), this.addOnReadyListener(), this.handshake() } getTransfer(a) { var h; switch (a.cmd) { case ge.SUBSCRIBE: case ge.UNSUBSCRIBE: return; default: return (h = a.transfer) !== null && h !== void 0 ? h : void 0 } } close(a, h) { var p; window.removeEventListener("message", this.handleMessage); let d = Tr(); (p = this.source) === null || p === void 0 || p.postMessage([Xt.CLOSE, { code: a, message: h, nonce: d }], this.sourceOrigin) } subscribe(a, h, p) { return _n(this, void 0, void 0, function*() { let d = this.eventBus.listenerCount(a) , M = this.eventBus.on(a, h); return Object.values(_e).includes(a) && a !== _e.READY && d === 0 && (yield this.sendCommand({ cmd: ge.SUBSCRIBE, args: p, evt: a })), M }) } unsubscribe(a, h) { return _n(this, void 0, void 0, function*() { return Object.values(_e).includes(a) && a !== _e.READY && this.eventBus.listenerCount(a) === 1 && (yield this.sendCommand({ cmd: ge.UNSUBSCRIBE, evt: a })), this.eventBus.off(a, h) }) } ready() { return _n(this, void 0, void 0, function*() { this.isReady || (yield new Promise(a=>{ this.eventBus.once(_e.READY, a) } )) }) } subscribeToLayoutModeUpdatesCompat(a) { return _n(this, void 0, void 0, function*() { let h = M=>{ let F = M.is_pip_mode ? qn.PIP : qn.FOCUSED; a({ layout_mode: F }) } , p = yield this.subscribe(_e.ACTIVITY_PIP_MODE_UPDATE, h) , d = M=>{ this.unsubscribe(_e.ACTIVITY_PIP_MODE_UPDATE, h), a(M) } ; this.layoutModeUpdateListenerMap.set(a, { layoutModeListener: d, pipModeListener: h }); try { return yield this.subscribe(_e.ACTIVITY_LAYOUT_MODE_UPDATE, d) } catch (M) { if (M.code === jn.INVALID_EVENT) return p; throw M } }) } unsubscribeFromLayoutModeUpdatesCompat(a) { return _n(this, void 0, void 0, function*() { let h = this.layoutModeUpdateListenerMap.get(a); if (this.layoutModeUpdateListenerMap.delete(a), h != null) { let {layoutModeListener: p, pipModeListener: d} = h , M = null , F = null; if (p != null) try { M = yield this.unsubscribe(_e.ACTIVITY_LAYOUT_MODE_UPDATE, p) } catch (Z) { if (Z.code !== jn.INVALID_EVENT) throw Z } return d != null && (F = yield this.unsubscribe(_e.ACTIVITY_PIP_MODE_UPDATE, d)), M ?? F } }) } handshake() { var a; (a = this.source) === null || a === void 0 || a.postMessage([Xt.HANDSHAKE, { v: 1, encoding: "json", client_id: this.clientId, frame_id: this.frameId }], this.sourceOrigin) } addOnReadyListener() { this.eventBus.once(_e.READY, ()=>{ this.overrideConsoleLogging(), this.isReady = !0 } ) } overrideConsoleLogging() { if (this.configuration.disableConsoleLogOverride) return; let a = (h,p)=>{ this.commands.captureLog({ level: h, message: p }) } ; Uu.forEach(h=>{ zu(console, h, a) } ) } handleClose(a) { nu.parse(a) } handleHandshake() {} handleFrame(a) { var h, p; let d; try { d = ru(a) } catch (M) { console.error("Failed to parse", a), console.error(M); return } if (d.cmd === "DISPATCH") this.eventBus.emit(d.evt, d.data); else { if (d.evt === nr) { if (d.nonce != null) { (h = this.pendingCommands.get(d.nonce)) === null || h === void 0 || h.reject(d.data), this.pendingCommands.delete(d.nonce); return } this.eventBus.emit("error", new Zi(d.data.code,d.data.message)) } if (d.nonce == null) { console.error("Missing nonce", a); return } (p = this.pendingCommands.get(d.nonce)) === null || p === void 0 || p.resolve(d), this.pendingCommands.delete(d.nonce) } } } ; var Hi = { exports: {} }; (function(c, a) { var h = 200 , p = "Expected a function" , d = "__lodash_hash_undefined__" , M = 1 , F = 2 , Z = 1 / 0 , q = 9007199254740991 , k = "[object Arguments]" , O = "[object Array]" , B = "[object Boolean]" , C = "[object Date]" , Q = "[object Error]" , J = "[object Function]" , ne = "[object GeneratorFunction]" , Y = "[object Map]" , Me = "[object Number]" , le = "[object Object]" , Se = "[object Promise]" , ye = "[object RegExp]" , oe = "[object Set]" , We = "[object String]" , ct = "[object Symbol]" , je = "[object WeakMap]" , Pt = "[object ArrayBuffer]" , ft = "[object DataView]" , dt = "[object Float32Array]" , qe = "[object Float64Array]" , pe = "[object Int8Array]" , Vt = "[object Int16Array]" , re = "[object Int32Array]" , Ot = "[object Uint8Array]" , Ft = "[object Uint8ClampedArray]" , ke = "[object Uint16Array]" , ot = "[object Uint32Array]" , kt = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/ , yn = /^\w*$/ , Gt = /^\./ , Mt = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g , Xe = /[\\^$.*+?()[\]{}|]/g , xt = /\\(\\)?/g , en = /^\[object .+?Constructor\]$/ , Kt = /^(?:0|[1-9]\d*)$/ , Ce = {}; Ce[dt] = Ce[qe] = Ce[pe] = Ce[Vt] = Ce[re] = Ce[Ot] = Ce[Ft] = Ce[ke] = Ce[ot] = !0, Ce[k] = Ce[O] = Ce[Pt] = Ce[B] = Ce[ft] = Ce[C] = Ce[Q] = Ce[J] = Ce[Y] = Ce[Me] = Ce[le] = Ce[ye] = Ce[oe] = Ce[We] = Ce[je] = !1; var tt = typeof ri == "object" && ri && ri.Object === Object && ri , Ke = typeof self == "object" && self && self.Object === Object && self , Rt = tt || Ke || Function("return this")() , Zt = a && !a.nodeType && a , tn = Zt && !0 && c && !c.nodeType && c , cn = tn && tn.exports === Zt , wn = cn && tt.process , bn = function() { try { return wn && wn.binding("util") } catch {} }() , kn = bn && bn.isTypedArray; function Sn(P, U) { for (var X = -1, ie = P ? P.length : 0; ++X < ie && U(P[X], X, P) !== !1; ) ; return P } function Bn(P, U) { for (var X = -1, ie = P ? P.length : 0; ++X < ie; ) if (U(P[X], X, P)) return !0; return !1 } function Je(P) { return function(U) { return U?.[P] } } function nn(P, U) { for (var X = -1, ie = Array(P); ++X < P; ) ie[X] = U(X); return ie } function Qe(P) { return function(U) { return P(U) } } function En(P, U) { return P?.[U] } function ae(P) { var U = !1; if (P != null && typeof P.toString != "function") try { U = !!(P + "") } catch {} return U } function e(P) { var U = -1 , X = Array(P.size); return P.forEach(function(ie, Ne) { X[++U] = [Ne, ie] }), X } function t(P, U) { return function(X) { return P(U(X)) } } function n(P) { var U = -1 , X = Array(P.size); return P.forEach(function(ie) { X[++U] = ie }), X } var i = Array.prototype , r = Function.prototype , s = Object.prototype , u = Rt["__core-js_shared__"] , o = function() { var P = /[^.]+$/.exec(u && u.keys && u.keys.IE_PROTO || ""); return P ? "Symbol(src)_1." + P : "" }() , l = r.toString , f = s.hasOwnProperty , g = s.toString , y = RegExp("^" + l.call(f).replace(Xe, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$") , _ = Rt.Symbol , v = Rt.Uint8Array , b = t(Object.getPrototypeOf, Object) , T = Object.create , x = s.propertyIsEnumerable , S = i.splice , I = t(Object.keys, Object) , m = In(Rt, "DataView") , w = In(Rt, "Map") , E = In(Rt, "Promise") , A = In(Rt, "Set") , N = In(Rt, "WeakMap") , L = In(Object, "create") , R = dn(m) , D = dn(w) , V = dn(E) , z = dn(A) , G = dn(N) , H = _ ? _.prototype : void 0 , K = H ? H.valueOf : void 0 , $ = H ? H.toString : void 0; function W(P) { var U = -1 , X = P ? P.length : 0; for (this.clear(); ++U < X; ) { var ie = P[U]; this.set(ie[0], ie[1]) } } function te() { this.__data__ = L ? L(null) : {} } function se(P) { return this.has(P) && delete this.__data__[P] } function ue(P) { var U = this.__data__; if (L) { var X = U[P]; return X === d ? void 0 : X } return f.call(U, P) ? U[P] : void 0 } function Ie(P) { var U = this.__data__; return L ? U[P] !== void 0 : f.call(U, P) } function Ee(P, U) { var X = this.__data__; return X[P] = L && U === void 0 ? d : U, this } W.prototype.clear = te, W.prototype.delete = se, W.prototype.get = ue, W.prototype.has = Ie, W.prototype.set = Ee; function de(P) { var U = -1 , X = P ? P.length : 0; for (this.clear(); ++U < X; ) { var ie = P[U]; this.set(ie[0], ie[1]) } } function ve() { this.__data__ = [] } function Oe(P) { var U = this.__data__ , X = Ct(U, P); if (X < 0) return !1; var ie = U.length - 1; return X == ie ? U.pop() : S.call(U, X, 1), !0 } function Te(P) { var U = this.__data__ , X = Ct(U, P); return X < 0 ? void 0 : U[X][1] } function Ge(P) { return Ct(this.__data__, P) > -1 } function Re(P, U) { var X = this.__data__ , ie = Ct(X, P); return ie < 0 ? X.push([P, U]) : X[ie][1] = U, this } de.prototype.clear = ve, de.prototype.delete = Oe, de.prototype.get = Te, de.prototype.has = Ge, de.prototype.set = Re; function xe(P) { var U = -1 , X = P ? P.length : 0; for (this.clear(); ++U < X; ) { var ie = P[U]; this.set(ie[0], ie[1]) } } function ze() { this.__data__ = { hash: new W, map: new (w || de), string: new W } } function De(P) { return Jn(this, P).delete(P) } function _t(P) { return Jn(this, P).get(P) } function gt(P) { return Jn(this, P).has(P) } function Et(P, U) { return Jn(this, P).set(P, U), this } xe.prototype.clear = ze, xe.prototype.delete = De, xe.prototype.get = _t, xe.prototype.has = gt, xe.prototype.set = Et; function nt(P) { var U = -1 , X = P ? P.length : 0; for (this.__data__ = new xe; ++U < X; ) this.add(P[U]) } function Ye(P) { return this.__data__.set(P, d), this } function ut(P) { return this.__data__.has(P) } nt.prototype.add = nt.prototype.push = Ye, nt.prototype.has = ut; function st(P) { this.__data__ = new de(P) } function vt() { this.__data__ = new de } function Ht(P) { return this.__data__.delete(P) } function fn(P) { return this.__data__.get(P) } function jt(P) { return this.__data__.has(P) } function Yt(P, U) { var X = this.__data__; if (X instanceof de) { var ie = X.__data__; if (!w || ie.length < h - 1) return ie.push([P, U]), this; X = this.__data__ = new xe(ie) } return X.set(P, U), this } st.prototype.clear = vt, st.prototype.delete = Ht, st.prototype.get = fn, st.prototype.has = jt, st.prototype.set = Yt; function Dt(P, U) { var X = Wt(P) || gr(P) ? nn(P.length, String) : [] , ie = X.length , Ne = !!ie; for (var me in P) (U || f.call(P, me)) && !(Ne && (me == "length" || fr(me, ie))) && X.push(me); return X } function Ct(P, U) { for (var X = P.length; X--; ) if (_r(P[X][0], U)) return X; return -1 } function Tn(P) { return Cn(P) ? T(P) : {} } var $t = aa(); function Oi(P, U) { return P && $t(P, U, ti) } function lr(P, U) { U = Xn(U, P) ? [U] : hr(U); for (var X = 0, ie = U.length; P != null && X < ie; ) P = P[Qn(U[X++])]; return X && X == ie ? P : void 0 } function Ys(P) { return g.call(P) } function $s(P, U) { return P != null && U in Object(P) } function xi(P, U, X, ie, Ne) { return P === U ? !0 : P == null || U == null || !Cn(P) && !ei(U) ? P !== P && U !== U : Ws(P, U, xi, X, ie, Ne) } function Ws(P, U, X, ie, Ne, me) { var Ze = Wt(P) , $e = Wt(U) , it = O , mt = O; Ze || (it = rn(P), it = it == k ? le : it), $e || (mt = rn(U), mt = mt == k ? le : mt); var At = it == le && !ae(P) , Nt = mt == le && !ae(U) , yt = it == mt; if (yt && !At) return me || (me = new st), Ze || mr(P) ? cr(P, U, X, ie, Ne, me) : oa(P, U, it, X, ie, Ne, me); if (!(Ne & F)) { var Bt = At && f.call(P, "__wrapped__") , Ut = Nt && f.call(U, "__wrapped__"); if (Bt || Ut) { var sn = Bt ? P.value() : P , Jt = Ut ? U.value() : U; return me || (me = new st), X(sn, Jt, ie, Ne, me) } } return yt ? (me || (me = new st), ua(P, U, X, ie, Ne, me)) : !1 } function Js(P, U, X, ie) { var Ne = X.length , me = Ne , Ze = !ie; if (P == null) return !me; for (P = Object(P); Ne--; ) { var $e = X[Ne]; if (Ze && $e[2] ? $e[1] !== P[$e[0]] : !($e[0]in P)) return !1 } for (; ++Ne < me; ) { $e = X[Ne]; var it = $e[0] , mt = P[it] , At = $e[1]; if (Ze && $e[2]) { if (mt === void 0 && !(it in P)) return !1 } else { var Nt = new st; if (ie) var yt = ie(mt, At, it, P, U, Nt); if (!(yt === void 0 ? xi(At, mt, ie, M | F, Nt) : yt)) return !1 } } return !0 } function Xs(P) { if (!Cn(P) || fa(P)) return !1; var U = Li(P) || ae(P) ? y : en; return U.test(dn(P)) } function Qs(P) { return ei(P) && Mi(P.length) && !!Ce[g.call(P)] } function ea(P) { return typeof P == "function" ? P : P == null ? wa : typeof P == "object" ? Wt(P) ? ia(P[0], P[1]) : na(P) : ba(P) } function ta(P) { if (!da(P)) return I(P); var U = []; for (var X in Object(P)) f.call(P, X) && X != "constructor" && U.push(X); return U } function na(P) { var U = la(P); return U.length == 1 && U[0][2] ? pr(U[0][0], U[0][1]) : function(X) { return X === P || Js(X, P, U) } } function ia(P, U) { return Xn(P) && dr(U) ? pr(Qn(P), U) : function(X) { var ie = va(X, P); return ie === void 0 && ie === U ? ma(X, P) : xi(U, ie, void 0, M | F) } } function ra(P) { return function(U) { return lr(U, P) } } function sa(P) { if (typeof P == "string") return P; if (Ri(P)) return $ ? $.call(P) : ""; var U = P + ""; return U == "0" && 1 / P == -Z ? "-0" : U } function hr(P) { return Wt(P) ? P : pa(P) } function aa(P) { return function(U, X, ie) { for (var Ne = -1, me = Object(U), Ze = ie(U), $e = Ze.length; $e--; ) { var it = Ze[P ? $e : ++Ne]; if (X(me[it], it, me) === !1) break } return U } } function cr(P, U, X, ie, Ne, me) { var Ze = Ne & F , $e = P.length , it = U.length; if ($e != it && !(Ze && it > $e)) return !1; var mt = me.get(P); if (mt && me.get(U)) return mt == U; var At = -1 , Nt = !0 , yt = Ne & M ? new nt : void 0; for (me.set(P, U), me.set(U, P); ++At < $e; ) { var Bt = P[At] , Ut = U[At]; if (ie) var sn = Ze ? ie(Ut, Bt, At, U, P, me) : ie(Bt, Ut, At, P, U, me); if (sn !== void 0) { if (sn) continue; Nt = !1; break } if (yt) { if (!Bn(U, function(Jt, pn) { if (!yt.has(pn) && (Bt === Jt || X(Bt, Jt, ie, Ne, me))) return yt.add(pn) })) { Nt = !1; break } } else if (!(Bt === Ut || X(Bt, Ut, ie, Ne, me))) { Nt = !1; break } } return me.delete(P), me.delete(U), Nt } function oa(P, U, X, ie, Ne, me, Ze) { switch (X) { case ft: if (P.byteLength != U.byteLength || P.byteOffset != U.byteOffset) return !1; P = P.buffer, U = U.buffer; case Pt: return !(P.byteLength != U.byteLength || !ie(new v(P), new v(U))); case B: case C: case Me: return _r(+P, +U); case Q: return P.name == U.name && P.message == U.message; case ye: case We: return P == U + ""; case Y: var $e = e; case oe: var it = me & F; if ($e || ($e = n), P.size != U.size && !it) return !1; var mt = Ze.get(P); if (mt) return mt == U; me |= M, Ze.set(P, U); var At = cr($e(P), $e(U), ie, Ne, me, Ze); return Ze.delete(P), At; case ct: if (K) return K.call(P) == K.call(U) } return !1 } function ua(P, U, X, ie, Ne, me) { var Ze = Ne & F , $e = ti(P) , it = $e.length , mt = ti(U) , At = mt.length; if (it != At && !Ze) return !1; for (var Nt = it; Nt--; ) { var yt = $e[Nt]; if (!(Ze ? yt in U : f.call(U, yt))) return !1 } var Bt = me.get(P); if (Bt && me.get(U)) return Bt == U; var Ut = !0; me.set(P, U), me.set(U, P); for (var sn = Ze; ++Nt < it; ) { yt = $e[Nt]; var Jt = P[yt] , pn = U[yt]; if (ie) var yr = Ze ? ie(pn, Jt, yt, U, P, me) : ie(Jt, pn, yt, P, U, me); if (!(yr === void 0 ? Jt === pn || X(Jt, pn, ie, Ne, me) : yr)) { Ut = !1; break } sn || (sn = yt == "constructor") } if (Ut && !sn) { var ni = P.constructor , ii = U.constructor; ni != ii && "constructor"in P && "constructor"in U && !(typeof ni == "function" && ni instanceof ni && typeof ii == "function" && ii instanceof ii) && (Ut = !1) } return me.delete(P), me.delete(U), Ut } function Jn(P, U) { var X = P.__data__; return ca(U) ? X[typeof U == "string" ? "string" : "hash"] : X.map } function la(P) { for (var U = ti(P), X = U.length; X--; ) { var ie = U[X] , Ne = P[ie]; U[X] = [ie, Ne, dr(Ne)] } return U } function In(P, U) { var X = En(P, U); return Xs(X) ? X : void 0 } var rn = Ys; (m && rn(new m(new ArrayBuffer(1))) != ft || w && rn(new w) != Y || E && rn(E.resolve()) != Se || A && rn(new A) != oe || N && rn(new N) != je) && (rn = function(P) { var U = g.call(P) , X = U == le ? P.constructor : void 0 , ie = X ? dn(X) : void 0; if (ie) switch (ie) { case R: return ft; case D: return Y; case V: return Se; case z: return oe; case G: return je } return U } ); function ha(P, U, X) { U = Xn(U, P) ? [U] : hr(U); for (var ie, Ne = -1, Ze = U.length; ++Ne < Ze; ) { var me = Qn(U[Ne]); if (!(ie = P != null && X(P, me))) break; P = P[me] } if (ie) return ie; var Ze = P ? P.length : 0; return !!Ze && Mi(Ze) && fr(me, Ze) && (Wt(P) || gr(P)) } function fr(P, U) { return U = U ?? q, !!U && (typeof P == "number" || Kt.test(P)) && P > -1 && P % 1 == 0 && P < U } function Xn(P, U) { if (Wt(P)) return !1; var X = typeof P; return X == "number" || X == "symbol" || X == "boolean" || P == null || Ri(P) ? !0 : yn.test(P) || !kt.test(P) || U != null && P in Object(U) } function ca(P) { var U = typeof P; return U == "string" || U == "number" || U == "symbol" || U == "boolean" ? P !== "__proto__" : P === null } function fa(P) { return !!o && o in P } function da(P) { var U = P && P.constructor , X = typeof U == "function" && U.prototype || s; return P === X } function dr(P) { return P === P && !Cn(P) } function pr(P, U) { return function(X) { return X == null ? !1 : X[P] === U && (U !== void 0 || P in Object(X)) } } var pa = Ni(function(P) { P = ga(P); var U = []; return Gt.test(P) && U.push(""), P.replace(Mt, function(X, ie, Ne, me) { U.push(Ne ? me.replace(xt, "$1") : ie || X) }), U }); function Qn(P) { if (typeof P == "string" || Ri(P)) return P; var U = P + ""; return U == "0" && 1 / P == -Z ? "-0" : U } function dn(P) { if (P != null) { try { return l.call(P) } catch {} try { return P + "" } catch {} } return "" } function Ni(P, U) { if (typeof P != "function" || U && typeof U != "function") throw new TypeError(p); var X = function() { var ie = arguments , Ne = U ? U.apply(this, ie) : ie[0] , me = X.cache; if (me.has(Ne)) return me.get(Ne); var Ze = P.apply(this, ie); return X.cache = me.set(Ne, Ze), Ze }; return X.cache = new (Ni.Cache || xe), X } Ni.Cache = xe; function _r(P, U) { return P === U || P !== P && U !== U } function gr(P) { return _a(P) && f.call(P, "callee") && (!x.call(P, "callee") || g.call(P) == k) } var Wt = Array.isArray; function vr(P) { return P != null && Mi(P.length) && !Li(P) } function _a(P) { return ei(P) && vr(P) } function Li(P) { var U = Cn(P) ? g.call(P) : ""; return U == J || U == ne } function Mi(P) { return typeof P == "number" && P > -1 && P % 1 == 0 && P <= q } function Cn(P) { var U = typeof P; return !!P && (U == "object" || U == "function") } function ei(P) { return !!P && typeof P == "object" } function Ri(P) { return typeof P == "symbol" || ei(P) && g.call(P) == ct } var mr = kn ? Qe(kn) : Qs; function ga(P) { return P == null ? "" : sa(P) } function va(P, U, X) { var ie = P == null ? void 0 : lr(P, U); return ie === void 0 ? X : ie } function ma(P, U) { return P != null && ha(P, U, $s) } function ti(P) { return vr(P) ? Dt(P) : ta(P) } function ya(P, U, X) { var ie = Wt(P) || mr(P); if (U = ea(U), X == null) if (ie || Cn(P)) { var Ne = P.constructor; ie ? X = Wt(P) ? new Ne : [] : X = Li(Ne) ? Tn(b(P)) : {} } else X = {}; return (ie ? Sn : Oi)(P, function(me, Ze, $e) { return U(X, me, Ze, $e) }), X } function wa(P) { return P } function ba(P) { return Xn(P) ? Je(Qn(P)) : ra(P) } c.exports = ya } )(Hi, Hi.exports); var Ku = Hi.exports; var {Commands: Yu} = vo; var Gu = ` ` , Ti = c=>{ try { if (c.dataset?.state === "loading") return; c.disabled = !0, c.dataset.state = "loading", c.innerHTML = `
    ${Gu}
    ${c.innerHTML}
    ` } catch { console.error("failed to start loading", c) } } , Ii = c=>{ try { if (c.dataset?.state !== "loading") return; delete c.dataset.state, c.disabled = !1; let a = null; for (let h = 0; h < c.childElementCount; h++) { let p = c.children[h]; if (p.classList?.contains("loading-container")) { a = p; break } } c.innerHTML = a.innerHTML } catch (a) { console.error("failed to stop loading", c, a) } } ; var Yn = class extends EventTarget { constructor(a) { super(), this.tool = new ce.Tool, this.lastTolerance = 5, this.selectedSegments = [], this.editor = a, this.tool.onKeyDown = h=>{ this.onKeyDown(h) } , this.tool.onMouseDown = h=>{ this.onMouseDown(h) } , this.tool.onMouseDrag = h=>{ this.onMouseDrag(h) } , this.tool.onMouseMove = h=>{ this.onMouseMove(h) } , this.tool.onMouseUp = h=>{ this.onMouseUp(h) } } hitTestActiveLayer(a) { return ce.project.hitTest(a, { segments: !0, stroke: !0, fill: !0, tolerance: this.lastTolerance, match: h=>h.item.layer == ce.project.activeLayer && !h.item.name.includes("Background") && !h.item.name.includes("Checkerboard") }) } onMouseDown(a) { a.event.pointerId && this.editor.canvas.setPointerCapture(a.event.pointerId || 1), this.clampToBounds(a), this.button = !a.event.button || a.event.button <= 0 ? this.editor.selectedTool : a.event.button, this.minDistance = this.button == 2 ? this.lastTolerance * 2 : 0, this.currentSegment = this.currentPath = null; let h = this.hitTestActiveLayer(a.point); if (!this.button || this.button <= 0) this.currentPath = new ce.Path.Rectangle({ from: a.point, to: a.point }), this.currentPath.strokeColor = new ce.Color("#eeeeee"), this.currentPath.strokeColor.alpha = 1, this.currentPath.strokeCap = "round", this.currentPath.isRectangle = !0, this.currentPath.strokeWidth = 4, this.currentPath.strokeColor = new ce.Color("rgba(255,255,255,1)"), this.currentPath.dashArray = [10, 10], this.currentPath.add(a.point), this.editor.drawingLayer.addChild(this.currentPath); else if (this.button == .5) this.currentPath = new ce.Path({ segments: [a.point] }), this.currentPath.strokeWidth = 4, this.currentPath.strokeColor = new ce.Color("rgba(255,255,255,1)"), this.currentPath.dashArray = [10, 10], this.currentPath.add(a.point), this.currentPath.strokeCap = "round", this.currentPath.isStroke = !0, this.currentPath.closed = !0, this.currentPath.fillColor = new ce.Color(1,1,1), this.editor.drawingLayer.addChild(this.currentPath); else if (this.button == 1) { if (!h) this.selectionRectPath = new ce.Path.Rectangle({ from: a.point, to: a.point }); else if (this.selectedSegments.length > 0) this.markForSave = !0; else if (this.currentPath = h.item, this.currentPath && (this.saveItemStateForUndo(h.item), h.type == "stroke" || h.type == "fill")) if (this.editor.movePath) this.currentSegment = null; else { let p = h.location; this.currentSegment = this.currentPath.insert(p.index + 1, a.point), this.currentPath.smooth() } } else if (h && this.button == 2) { if (this.selectedSegments.length > 0) for (let p = ce.project.selectedItems.length - 1; p >= 0; p--) { let d = ce.project.selectedItems[p]; d.selected = !1, this.saveItemStateForUndo(d), d.remove() } else h.type == "stroke" || h.type == "fill" || h.segment.path.segments.length <= 2 ? (this.saveItemStateForUndo(h.item), h.item.remove()) : h.type == "segment" && (this.saveItemStateForUndo(h.item), h.segment.remove()); return } } onMouseMove(a) { if (this.clampToBounds(a), this.selectedSegments.length == 0) { ce.project.activeLayer.selected = !1; let h = this.hitTestActiveLayer(a.point); h && (h.item.selected = !0, h.item.strokeWidth && (this.lastTolerance = Math.max(h.item.strokeWidth / 4, 5))) } } onMouseDrag(a) { if (this.clampToBounds(a), !this.button || this.button <= 0) { if (ce.project.activeLayer.selected = !1, this.currentPath && this.currentPath.isRectangle) { let h = new ce.Path.Rectangle(a.downPoint,a.point); h.fillColor = "white", this.currentPath.replaceWith(h), this.currentPath.remove(), this.currentPath = h, this.currentPath.bounds.selected = !0, this.currentPath.isRectangle = !0 } } else if (this.button == .5) ce.project.activeLayer.selected = !1, this.currentPath.add(a.point); else if (this.button == 1) if (this.selectionRectPath) { let h = new ce.Path.Rectangle(a.downPoint,a.point); this.selectionRectPath.replaceWith(h), this.selectionRectPath.remove(), this.selectionRectPath = h, this.selectionRectPath.bounds.selected = !0, this.selectedSegments = []; for (let d = 0; d < ce.project.selectedItems.length; d++) ce.project.selectedItems[d].selected = !1; let p = this.editor.drawingLayer.getItems({ overlapping: h.bounds }); for (let d = 0; d < p.length; d++) if (p[d].segments) for (let M = 0; M < p[d].segments.length; M++) this.selectionRectPath.bounds.contains(p[d].segments[M].point) && (p[d].segments[M].selected = !0, this.selectedSegments.push(p[d].segments[M])) } else if (this.selectedSegments.length > 0) { if (this.markForSave) { for (let h = ce.project.selectedItems.length - 1; h >= 0; h--) this.saveItemStateForUndo(ce.project.selectedItems[h]); this.markForSave = !1 } for (let h = 0; h < this.selectedSegments.length; h++) this.selectedSegments[h].point = this.selectedSegments[h].point.add(a.delta) } else this.currentSegment ? this.currentSegment.point = this.currentSegment.point.add(a.delta) : this.currentPath && (this.currentPath.position = this.currentPath.position.add(a.delta)); else if (this.button == 2) { let h = this.hitTestActiveLayer(a.point); if (!h) return; h.type == "stroke" || h.type == "fill" || h.segment.path.segments.length <= 2 ? (this.saveItemStateForUndo(h.item), h.item.remove()) : h.type == "segment" && (this.saveItemStateForUndo(h.item), h.segment.remove()) } } onMouseUp(a) { a.event.pointerId && this.editor.canvas.releasePointerCapture(a.event.pointerId || 1), this.clampToBounds(a), this.selectionRectPath && (this.selectionRectPath.remove(), this.selectionRectPath = null), (!this.button || this.button <= .5) && (this.currentPath.isRectangle || (this.currentPath.segments.length > 1 ? this.currentPath.simplify(3) : this.currentPath.add(a.point), this.currentPath.strokeColor = new ce.Color("#ffffff")), this.clearSelection(), this.dispatchEvent(new Event("newStroke",{ name: this.currentPath.name })), this.currentPath.bounds.selected = !1, this.currentPath.name = "Stroke-" + this.stringHashCode(this.currentPath.toString()), this.currentPath.strokeColor = null, this.editor.undoLayer.addChild(new ce.Group({ name: this.editor.removeCmd + this.currentPath.name })), this.editor.redoLayer.removeChildren()) } async onKeyDown(a) { if (a.key == "enter") { if (a.preventDefault(), a.stopPropagation(), this.editor.submitButton.disabled || this.editor.submitButton.dataset?.state === "loading") return; Ti(this.editor.submitButton); try { await this.editor.submit().catch(h=>this.editor.displayError(h?.toString())) } finally { Ii(this.editor.submitButton) } } else (a.modifiers.control || a.modifiers.meta) && (a.key == "z" ? this.editor.undo() : a.key == "y" && this.editor.redo()) } clearSelection() { for (let a = 0; a < this.selectedSegments.length; a++) this.selectedSegments[a].selected = !1; this.selectedSegments = []; for (let a = 0; a < ce.project.selectedItems.length; a++) ce.project.selectedItems[a].selected = !1 } saveItemStateForUndo(a) { a.name || (a.name = "ForeignObject-" + this.stringHashCode(a.toString())); let h = a.clone(); h.name = a.name, this.editor.undoLayer.addChild(h), this.editor.redoLayer.removeChildren() } stringHashCode(a) { let h = 0; if (a.length == 0) return h; for (let p = 0; p < a.length; p++) { let d = a.charCodeAt(p); h = (h << 5) - h + d, h = h & h } return h } clampToBounds(a) { let h = this.editor.backgroundImageElement.width , p = this.editor.backgroundImageElement.height; a.point = a.point.set(Math.min(h * .5, Math.max(-h * .5, a.point.x)), Math.min(p * .5, Math.max(-p * .5, a.point.y))) } } ; var Ci = class { constructor(a) { this.omniTool = a, this.promptBarAvailable = !1 } start() { this.omniTool.addEventListener("newStroke", ()=>{ this.promptBarAvailable ? (this.createPopover("When you're ready, edit the prompt to describe the new image"), document.getElementById("Prompt").addEventListener("input", ()=>{ this.createPopover("按右下角箭头提交") } , { once: !0 })) : this.createPopover("按右下角箭头提交") } , { once: !0 }), this.createPopover("请拖动选择要更改的区域") } setPromptBarAvailable(a) { this.promptBarAvailable = a } createPopover(a) { let h = document.getElementById("popover-container"); h.innerHTML = ""; let p = document.createElement("div"); p.className = "popover", p.innerText = a, h.appendChild(p) } } ; var ar = document.getElementById("modal-container"); document.addEventListener("click", c=>{ c.target.classList.contains("modal-backdrop") && Ai() } ); var Ai = ()=>{ ar.innerHTML = "" } , hn = c=>{ let a = c.header !== void 0; ar.innerHTML = ""; let h = document.createElement("div"); h.classList.add("modal"); let p = document.createElement("div"); if (p.classList.add("modal-body"), p.innerHTML = ` ${a ? `` : ""} `, c.footer !== void 0) { let F = document.createElement("div"); F.classList.add("modal-footer"), c.footer && (typeof c.footer == "string" ? F.innerHTML = c.footer : F.appendChild(c.footer)), p.appendChild(F) } let M = document.createElement("div"); M.classList.add("modal-backdrop"), h.appendChild(M), h.appendChild(p), ar.appendChild(h) } ; var Zu = { "": ["", ""], _: ["", ""], "*": ["", ""], "~": ["", ""], "\n": ["
    "], " ": ["
    "], "-": ["
    "] }; function Ks(c) { return c.replace(RegExp("^" + (c.match(/^(\t| )+/) || "")[0], "gm"), "") } function $n(c) { return (c + "").replace(/"/g, """).replace(//g, ">") } function Wn(c, a) { let h = /((?:^|\n+)(?:\n---+|\* \*(?: \*)+)\n)|(?:^``` *(\w*)\n([\s\S]*?)\n```$)|((?:(?:^|\n+)(?:\t| {2,}).+)+\n*)|((?:(?:^|\n)([>*+-]|\d+\.)\s+.*)+)|(?:!\[([^\]]*?)\]\(([^)]+?)\))|(\[)|(\](?:\(([^)]+?)\))?)|(?:(?:^|\n+)([^\s].*)\n(-{3,}|={3,})(?:\n+|$))|(?:(?:^|\n+)(#{1,6})\s*(.+)(?:\n+|$))|(?:`([^`].*?)`)|( \n\n*|\n{2,}|__|\*\*|[_*]|~~)/gm, p = [], d = "", M = a || {}, F = 0, Z, q, k, O, B; function C(J) { let ne = Zu[J[1] || ""] , Y = p[p.length - 1] == J; return ne ? ne[1] ? (Y ? p.pop() : p.push(J), ne[Y | 0]) : ne[0] : J } function Q() { let J = ""; for (; p.length; ) J += C(p[p.length - 1]); return J } for (c = c.replace(/^\[(.+?)\]:\s*(.+)$/gm, (J,ne,Y)=>(M[ne.toLowerCase()] = Y, "")).replace(/^\n+|\n+$/g, ""); k = h.exec(c); ) q = c.substring(F, k.index), F = h.lastIndex, Z = k[0], q.match(/[^\\](\\\\)*\\$/) || ((B = k[3] || k[4]) ? Z = '
    " + Ks($n(B).replace(/^\n+|\n+$/g, "")) + "
    " : (B = k[6]) ? (B.match(/\./) && (k[5] = k[5].replace(/^\d+/gm, "")), O = Wn(Ks(k[5].replace(/^\s*[>*+.-]/gm, ""))), B == ">" ? B = "blockquote" : (B = B.match(/\./) ? "ol" : "ul", O = O.replace(/^(.*)(\n|$)/gm, "
  • $1
  • ")), Z = "<" + B + ">" + O + "") : k[8] ? Z = `${$n(k[7])}` : k[10] ? (d = d.replace("", ``), Z = Q() + "") : k[9] ? Z = "" : k[12] || k[14] ? (B = "h" + (k[14] ? k[14].length : k[13] > "=" ? 1 : 2), Z = "<" + B + ">" + Wn(k[12] || k[15], M) + "") : k[16] ? Z = "" + $n(k[16]) + "" : (k[17] || k[1]) && (Z = C(k[17] || "--"))), d += q, d += Z; return (d + c.substring(F) + Q()).replace(/^\n+|\n+$/g, "") } var or = class extends Error { constructor(a, h) { super(a + ": " + h), this.responseText = h } } , Pi = class { constructor() {} async getImageInfo(a, h, p) { return await fetch(`./api/get-image-info/${a}/${h}/${p}`).then(this._handleResponse) } async _handleResponse(a) { if (a.ok || 400 <= a.status < 500) return await a.json(); let h = await a.text(); throw new or(`request failed with ${a.status}`,h) } } ; var ur = class { constructor() { this.keymap = new Set, this.width = 1024, this.height = 1024, this.movePath = !0, this.removeCmd = "Remove-", this.selectedTool = 0, this.omniTool = new Yn(this), this.onboarding = new Ci(this.omniTool), this.api = new Pi, window.addEventListener( 'message', (e)=>{ //console.log("message",e.data); const obj= JSON.parse(e.data) this.imgInfo= obj.img_info; this.setup() }); //this.setup() } async setup() { if (this.imageURL = "./assets/strawberryshake.webp", this.inIFrame = window.location.search != "", this.currentPath = null, document.addEventListener("keydown", this.onKeyDown.bind(this)), document.addEventListener("keyup", this.onKeyUp.bind(this)), this.inIFrame) { if (this.searchParams = new URLSearchParams(window.location.search), this.customId = this.searchParams.get("custom_id").split("::")[2], this.applicationId = this.searchParams.get("instance_id").split(":")[1], this.guildId = this.searchParams.get("guild_id"), this.channelId = this.searchParams.get("channel_id"), this.platform = this.searchParams.get("platform"), //this.imgInfo = this.searchParams.get("img_info") && JSON.parse(this.searchParams.get("img_info")), this.discord = null) try { let d = window.location.hostname.split(".")[0]; this.discord = new di(d), console.log("Discord SDK was initialized!", this.discord) } catch (d) { console.error("Discord SDK could not be initialized!", d) } this.userId = "0", this.userName = "0"; let p = this.imgInfo; if (p.error === "invalid_id") { console.error("Error fetching image info:", p), this.discord != null && (p.message = "This session is invalid. Please relaunch the editor from the original message."), hn({ header: "Error", content: p.message, footer: this.createDefaultCloseButton() }); return } //console.log("Fetched Image info:", p), this.prompt = p.prompt, this.input_job_id = p.child_job_id, this.input_index = p.image_num, this.has_prompt_enabled = p.has_prompt_enabled, this.imageURL = p.image_url } else this.has_prompt_enabled = !0; this.backgroundImageElement = await this.loadImageAsync(this.imageURL), this.width = this.backgroundImageElement.width, this.height = this.backgroundImageElement.height, await this.forPageLoadAsync(), this.canvas = document.getElementById("InpaintingEditorCanvas"), ce.setup(this.canvas), ce.project.activeLayer.name = "EditorWorkspace", this.checkerboardImage = new ce.Raster("./assets/checkerboard.png"), this.checkerboardImage.name = "CheckerboardImage", this.checkerboardImage.position = new ce.Point(0,0), this.checkerboardImage.strokeWidth = 0, this.checkerboardImage.scale(Math.max(this.width, this.height) / 1024), this.drawingLayer = new ce.Group({ name: "Drawing", blendMode: "destination-atop" }), this.undoLayer = new ce.Group({ name: "Undo", visible: !1 }), this.redoLayer = new ce.Group({ name: "Redo", visible: !1 }), ce.project.activeLayer.addChildren(new ce.Group({ name: "CheckerboardCompositingGroup", children: [this.checkerboardImage, this.drawingLayer], blendMode: "source-over", opacity: .4 }), this.undoLayer), ce.project.activeLayer.addChild(this.redoLayer), ce.view.onFrame = p=>{ this.checkerboardImage.visible = !1; for (let d = 0; d < this.drawingLayer.children.length; d++) if (this.drawingLayer.children[d].bounds.area > 0) { this.checkerboardImage.visible = !0; break } } , ce.view.onResize = this.onResize.bind(this); let a = !1; this.toolbar = document.getElementById("appbody"), this.toolbar.addEventListener("mousedown", p=>{ a = !0 } ), document.body.addEventListener("mouseup", p=>{ a = !1, this.toolbar.classList.remove("fadeout") } ); let h = document.getElementById("popover-container"); document.addEventListener("mousemove", p=>{ p.buttons } ), ce.view.onMouseMove = p=>{ !(p.event.buttons === 1) || a || h.classList.add("fadeout") } , ce.view.onMouseDown = ce.view.onMouseMove, ce.view.onMouseUp = p=>{ h.classList.remove("fadeout") } , ce.view.onMouseLeave = p=>{ h.classList.remove("fadeout") } , document.getElementById("Undo").addEventListener("click", ()=>{ this.undo() } , !1), document.getElementById("Rect Tool").addEventListener("click", ()=>{ this.selectedTool = 0, this.highlightSelected() } , !1), document.getElementById("Lasso Tool").addEventListener("click", ()=>{ this.selectedTool = .5, this.highlightSelected() } , !1), this.bottomBar = document.getElementById("bottomBar"), this.promptBar = document.getElementById("Prompt"), this.promptBar.addEventListener("paste", p=>{ p.preventDefault(), p.stopPropagation(); let d = (p.originalEvent || p).clipboardData.getData("text/plain"); document.execCommand("insertText", !1, d) } ), this.submitLabel = document.getElementById("submit-label"), this.submitButton = document.getElementById("Submit"), this.submitButton.addEventListener("click", async p=>{ let d = p.target; if (d instanceof HTMLButtonElement && !(d.disabled || d.dataset?.state === "loading")) { Ti(d); try { await this.submit().catch(M=>this.displayError(M?.toString())) } finally { Ii(d) } } } , !1), this.has_prompt_enabled && (this.bottomBar.classList.remove("noFill"), this.promptBar.classList.remove("hidden"), this.submitButton.classList.remove("withText"), this.submitLabel.innerText = "", this.onboarding.setPromptBarAvailable(!0)), setInterval(()=>{ this.submitButton instanceof HTMLButtonElement && (this.submitButton.disabled = this.drawingLayer.children.length === 0) } , 100), this.prompt && (this.promptBar.textContent = this.prompt), this.highlightSelected(), this.onResize(), this.backgroundImage = new ce.Raster(this.backgroundImageElement), this.backgroundImage.name = "BackgroundImage", this.backgroundImage.position = new ce.Point(0,0), this.backgroundImage.strokeWidth = 0, this.backgroundImage.insertBelow(this.drawingLayer.parent), this.canvas.setAttribute("oncontextmenu", "return false;"), ce.settings.handleSize = 0; try { let p = window.localStorage.getItem(this.imageURL); p && ce.project.importSVG(p, { expandShapes: !0, insert: !1, onLoad: M=>{ M.translate(new ce.Point(-this.width / 2,-this.height / 2)), M.getItems({ recursive: !0 }).forEach(F=>{ F.name == this.drawingLayer.name ? this.drawingLayer.children = F.children : F.name == this.undoLayer.name ? this.undoLayer.children = F.children : F.name == this.redoLayer.name && (this.redoLayer.children = F.children) } ), this.inIFrame && (document.getElementById("popover-container").innerHTML = "") } , onError: M=>{ console.error(M) } }); let d = window.localStorage.getItem(this.imageURL + "-Prompt"); d && (this.prompt = d, this.promptBar.textContent = d) } catch (p) { console.log("Couldn't load Local Storage", p) } Ai(), this.onboarding.start() } onKeyDown(a) { this.keymap.add(a.key) } onKeyUp(a) { if (this.keymap.delete(a.key), a.key === "Escape") { let h = document.getElementById("Prompt"); h == document.activeElement ? h.blur() : this.close("User Exited") } } onResize(a) { let h = 0; if (a && a.canonicalSpace) ce.view.viewSize.set(this.width / window.devicePixelRatio, this.height / window.devicePixelRatio), ce.view.zoom = 1 / window.devicePixelRatio; else { let d = this.toolbar.getBoundingClientRect().height * 1.75; h = d; let M = this.canvas.width / window.devicePixelRatio , F = this.canvas.height / window.devicePixelRatio; ce.view.zoom = Math.max(.01, Math.min(M / this.width, (F - d) / this.height) * .95) } ce.view.translate(new ce.Point(ce.view.center.x,ce.view.center.y - h * .5 / ce.view.zoom)), ce.view.update() } undo() { this.processDoCommand(this.drawingLayer, this.undoLayer, this.redoLayer) } redo() { this.processDoCommand(this.drawingLayer, this.redoLayer, this.undoLayer) } close(a="Job Submitted!") { this.discord != null && this.discord.close(ci.CLOSE_NORMAL, a) } processDoCommand(a, h, p) { let d = h.lastChild; if (d) if (d.name && d.name.startsWith(this.removeCmd)) { let M = d.name.substring(this.removeCmd.length) , F = a.getItem({ match: Z=>Z.name == M }); p.addChild(F), d.remove() } else { let M = a.getItem({ match: F=>F.name == d.name }); if (M) { let F = M.clone(); F.name = M.name, p.addChild(F), M.replaceWith(d) } else a.addChild(d), p.addChild(new ce.Group({ name: this.removeCmd + d.name })) } } async submit() { document.getElementById("popover-container").innerHTML = "", document.getElementById("Prompt").blur(); let a = this.drawingLayer.children.length , h = this.drawingLayer.children; if (console.log({ childLength: a }), a == 0) { hn({ header: "请进行选择", content: "要使用修复功能,请开始拖动以选择您想要替换的图像区域。", footer: this.createDefaultCloseButton("好的") }); return } let p = 0; for (let ye = 0; ye < a; ye++) { let oe = h[ye]; oe.name.includes("Image") || (p += oe.bounds.width * oe.bounds.height) } if (p < 1e4) { hn({ header: "选择的区域太小了", content: "为了获得最佳效果,您需要选择更多的图像来替换。", footer: this.createDefaultCloseButton("好的") }); return } let d = document.getElementById("Prompt").textContent , M = ce.view.viewSize.width , F = ce.view.viewSize.height; this.omniTool.clearSelection(), ce.project.activeLayer.selected = !1, this.currentPath && (this.currentPath.bounds.selected = !1); let Z = this.drawingLayer.parent.opacity; this.drawingLayer.parent.opacity = 1, this.drawingLayer.blendMode = "normal", this.checkerboardImage.visible = !1, // console.log("Submitting Job..."), this.onResize({ canonicalSpace: !0 }); let q = ce.project.exportSVG({ asString: !0 }) , k = q.indexOf("", k); q = q.substring(0, k) + q.substring(O + 2), k = q.indexOf("", k), q = q.substring(0, k) + q.substring(O + 2), q = q.replace(/width="\d*\.?\d+" height="\d*\.?\d+" viewBox="0,0,\d*\.?\d+,\d*\.?\d+"/g, 'width="' + this.width + '" height="' + this.height + '" viewBox="0,0,' + this.width + "," + this.height + '"'), q = q.replace(/transform="translate\(\d*\.?\d+,\d*\.?\d+\) scale\(\d*\.?\d+,\d*\.?\d+\)"/g, 'transform="translate(' + this.width / 2 + "," + this.height / 2 + ') scale(1.0,1.0)"'); try { window.localStorage.setItem(this.imageURL, q), window.localStorage.setItem(this.imageURL + "-Prompt", d) } catch (ye) { console.log("Cannot access local storage!", ye) } let B = new ce.Path.Rectangle(ce.view.bounds); B.fillColor = "white", B.sendToBack(); for (let ye = 0; ye < a; ye++) { let oe = h[ye]; oe.name.includes("Image") || (oe.visible = !0) } let C = [] , Q = this.backgroundImage; if (Q.name && Q.visible && Q.name.includes("Image")) { let ye = new ce.Path.Rectangle(Q.bounds); ye.fillColor = "black", ye.insertAbove(Q), ye.name = "Occluder", C.push(ye) } this.omniTool.clearSelection(), ce.project.activeLayer.selected = !1, this.currentPath && (this.currentPath.bounds.selected = !1), this.onResize({ canonicalSpace: !0 }), ce.view.update(), this.omniTool.clearSelection(), ce.project.activeLayer.selected = !1, this.currentPath && (this.currentPath.bounds.selected = !1), this.onResize({ canonicalSpace: !0 }); let J = ce.view.getContext() , ne = J.getImageData(0, 0, this.canvas.width / window.devicePixelRatio, this.canvas.height / window.devicePixelRatio) , Y = ne.data; for (let ye = 0; ye < Y.length; ye += 4) Y[ye + 0] = Y[ye + 0] > 128 ? 255 : 0, Y[ye + 1] = Y[ye + 1] > 128 ? 255 : 0, Y[ye + 2] = Y[ye + 2] > 128 ? 255 : 0, Y[ye + 3] = 255; J.putImageData(ne, 0, 0); let Me = this.canvas.toDataURL("image/"+this.imgInfo.img_type, 1) , le = document.createElement("a"); this.inIFrame || (le.download = "drawingExportMask.webp", le.href = Me, le.click()); for (let ye = 0; ye < C.length; ye++) C[ye].remove(); B.remove(), ce.view.viewSize.set(M, F), ce.view.update(), this.onResize(), this.drawingLayer.parent.opacity = Z, this.drawingLayer.blendMode = "destination-atop", this.checkerboardImage.visible = !0, this.inIFrame || await new Promise(ye=>setTimeout(ye, 2e3)); let Se = Me.split(",")[1]; let ret = { username: this.userName, userId: this.userId, customId: this.customId, prompt: d, full_prompt: null, mask: Se }; //localStorage.setItem("mj-iframe-btn-click","1"); //localStorage.setItem("mj-iframe-btn-click-ret",JSON.stringify(ret)); window.parent.postMessage( JSON.stringify(ret) , '*' ) } async submitToBackend(a, h, p, d, M, F=null,aid) { let Z = await fetch("https://"+aid+".discordsays.com/inpaint/api/submit-job", { method: "POST", mode: "cors", cache: "no-cache", headers: { "Content-Type": "application/json", Accept: "application/json" }, body: JSON.stringify({ username: a, userId: h, customId: p, mask: d, prompt: M, full_prompt: F }) }); return Z.status == 200 ? (Z = await Z.json(), !this.keymap.has("Shift") && !this.keymap.has("Alt") && (this.close(), hn({ header: "Job Submitted!", content: "Your job was submitted successfully! You can now close this window, or make additional edits.", footer: this.createDefaultCloseButton() })), Z) : 400 <= Z.status < 500 ? (Z = await Z.json(), console.error("Received Error Response!", Z), hn({ header: "Error", content: Z.message, footer: this.createDefaultCloseButton() }), Z) : (hn({ header: "Error", content: "There was an error submitting your job. Please try again later.", footer: this.createDefaultCloseButton() }), null) } createDefaultCloseButton(a="Close") { let h = document.createElement("button"); return h.className = "modal-button", h.addEventListener("click", Ai), h.innerText = a, h } displayError(a) { hn({ header: "\u274C Submission Error!", content: `

    ${Wn(a)}

    `, footer: this.createDefaultCloseButton() }) } highlightSelected() { let a = document.getElementById("Rect Tool") , h = document.getElementById("Lasso Tool"); a.classList.remove("selected"), h.classList.remove("selected"), this.selectedTool == 0 ? a.classList.add("selected") : this.selectedTool == .5 && h.classList.add("selected") } loadImageAsync(a) { return new Promise((h,p)=>{ let d = new Image; d.src = a, d.crossOrigin = "anonymous", d.onload = ()=>h(d), d.onerror = ()=>p(new Error("could not load image")) } ) } forPageLoadAsync() { return new Promise(a=>{ document.readyState === "complete" ? a() : window.onload = a.bind(this) } ) } } ; window.inpaintingEditor = new ur; export {ur as InpaintingEditor}; /*! * Paper.js v0.12.17 - The Swiss Army Knife of Vector Graphics Scripting. * http://paperjs.org/ * * Copyright (c) 2011 - 2020, Jürg Lehni & Jonathan Puckey * http://juerglehni.com/ & https://puckey.studio/ * * Distributed under the MIT license. See LICENSE file for details. * * All rights reserved. * * Date: Thu Nov 3 21:15:36 2022 +0100 * *** * * Straps.js - Class inheritance library with support for bean-style accessors * * Copyright (c) 2006 - 2020 Jürg Lehni * http://juerglehni.com/ * * Distributed under the MIT license. * *** * * Acorn.js * https://marijnhaverbeke.nl/acorn/ * * Acorn is a tiny, fast JavaScript parser written in JavaScript, * created by Marijn Haverbeke and released under an MIT license. * */ ================================================ FILE: src/static/mitf/assets/style.css ================================================ /* reset */ * { padding: 0; margin: 0; box-sizing: border-box; } /* variables */ :root { --sait: var(--discord-safe-area-inset-top, env(safe-area-inset-top)); --saib: var(--discord-safe-area-inset-bottom, env(safe-area-inset-bottom)); --sail: var(--discord-safe-area-inset-left, env(safe-area-inset-left)); --sair: var(--discord-safe-area-inset-right, env(safe-area-inset-right)); --mono-100: 227, 5%, 100%; --mono-200: 227, 5%, 95%; --mono-300: 227, 5%, 70%; --mono-400: 227, 5%, 58%; --mono-500: 227, 5%, 50%; --mono-600: 227, 5%, 40%; --mono-700: 227, 5%, 35%; --discord-bg: rgb(49, 51, 56); --discord-overlay: #232428c4; } /* set if html tag has data-color-mode set to dark theme */ html[data-theme="light"] { --mono-100: 227, 5%, 10%; --mono-200: 227, 5%, 25%; --mono-300: 227, 5%, 35%; --mono-400: 227, 5%, 40%; --mono-500: 227, 5%, 60%; --mono-600: 227, 5%, 75%; --mono-700: 227, 5%, 87%; --discord-bg: white; --discord-overlay: #e0e1e2c4; } /** * Motion */ @keyframes slideInTop { from { opacity: 0; transform: translateY(-16px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideInBottom { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } html { /* background-color: var(--discord-bg); */ color: hsl(var(--mono-100)); font-family: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body { padding-left: var(--sail); padding-right: var(--sair); padding-top: var(--sait); padding-bottom: var(--saib); } /* Scale canvas with resize attribute to full size */ canvas[resize] { width: 100%; height: 100%; } /* Styles for the parent container */ .hidden { display: none !important; } .hstack { display: flex; gap: 4px; } .center { display: flex; justify-content: center; align-items: center; width: 100%; } #container { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; } #appbody { height: fit-content; position: fixed; display: flex; bottom: 16px; left: 0; right: 0; width: 100%; justify-content: space-between; transition: opacity 0.17s ease; padding-inline: 4px; z-index: 1; } @media (min-width: 640px) { #appbody { max-width: 70vw; margin: 0 auto; } #bottomBarWrapper { border-radius: 19px; } } .toolButton { flex-shrink: 0; align-self: flex-end; position: relative; width: 38px; /* match discord's style */ height: 38px; margin-right: 8px; margin-left: 0px } .fadeout { opacity: 0; } #buttonContainer { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; } button { display: flex; position: relative; width: 38px; /* match discord's style */ height: 38px; box-sizing: border-box; -webkit-box-direction: normal; -webkit-box-pack: center; -webkit-box-align: center; cursor: pointer; justify-content: center; align-items: center; user-select: none; color: hsla(var(--mono-100), 0.8); background-color: hsla(var(--mono-700), 0.6); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border: none; outline-offset: -1px; border-radius: 48px; } button:hover { background-color: hsla(var(--mono-700), 0.8); transition: background-color .17s ease, border .17s ease; } button:active { background-color: hsla(var(--mono-300), 0.8); transition: background-color .01s ease, border .01s ease; } button:disabled { opacity: 0.2; cursor: not-allowed; } button.selected { background-color: hsla(var(--mono-500), 0.8); transition: background-color .17s ease, border 0.17s ease; } @keyframes spinner { to { transform: rotate(360deg); } } .spinner-container { padding: 4px; z-index: 1; position: absolute; inset: 0; display: flex; justify-content: center; align-items: center; } .spinner { animation: spinner 1s linear infinite; fill: hsla(var(--mono-200), 0.85); } .loading-container { opacity: 0; transition: opacity 0.17s ease; } .Submit { border: none; outline: none; border-radius: 32px; background: none; position: relative; display: flex; backdrop-filter: none; -webkit-backdrop-filter: none; height: 28px; width: 28px; background-color: hsla(var(--mono-200), 1.0); } .Submit svg { color: hsl(var(--mono-700)); width: 14px; height: 14px; pointer-events: none; } .Submit svg:hover{ transition: fill .17s ease; } .Submit svg:active{ transition: fill .17s ease; } .Submit[data-state="loading"] { background-color: hsla(var(--mono-200), 0.2); cursor: not-allowed; } .withText { background-color: transparent; padding-inline: 8px; gap: 12px; width: unset !important; } .withText svg { color: hsla(var(--mono-200), 0.85); } #Undo { margin-left: 8px; } .no-animation { animation: none !important; } .textarea { /* 2.5x line-height */ max-height: 56px; background-color: transparent; border: none; color: hsla(var(--mono-100), 1.0); font-size: 16px; line-height: 1.4; resize: none; outline: none; outline-offset: 0px; padding-inline-start: 8px; flex: 1; display: block; overflow: auto; resize: none; white-space: break-spaces; word-break: normal; font-family: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-appearance: none; appearance: none; transition: max-height 0.17s ease; } .textarea[placeholder]:empty:before { content: attr(placeholder); color: hsla(var(--mono-100), 0.6); } .textarea[placeholder]:empty:focus:before { content: ""; } .textarea:focus, .textarea:active { box-shadow: none; max-height: unset; } /* hide the scrollbar to avoid overlap with the submit button */ .textarea::-webkit-scrollbar { display: none; } @media (max-width: 640px) { .textarea { min-width: auto; } .Submit { width: 38px; height: 38px; } .toolButton { width: 48px; /* match discord's style */ height: 48px; } } #submit-label { pointer-events: none; } #loadingModal { display: flex; } #splashPageModal { display: none; } #jobSubmittedModal { display: none; } #jobErroredModal { display: none; } .undoButtons { position: fixed; top: 16px; left: 8px; display: flex; flex-direction: column; justify-content: center; align-items: center; flex-direction: row; } .bottomBarWrapper { display: flex; flex-direction: row; overflow: hidden; align-items: center; border: none; /* border: 1px solid hsl(var(--mono-400)); */ padding-inline: 4px; padding-block: 4px; box-sizing: border-box; border-radius: 24px; background-color: hsla(var(--mono-700), 0.6); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); width: 100%; gap: 4px; } .noFill { width: unset; } /** * Tutorial overlay */ #popover-container { position: absolute; display: flex; align-items: center; justify-content: center; width: 100%; pointer-events: none; z-index: 10; } .popover { border: 1px solid hsla(var(--mono-100), 0.1); position: absolute; top: 16px; z-index: 10; padding-inline: 16px; padding-block: 9px; border-radius: 100px; font-size: 16px; max-width: 90vw; background-color: var(--discord-overlay); animation: slideInTop 0.3s ease; transition: opacity 0.3s ease; box-shadow: 0 2px 10px 0 rgba(0,0,0,0.09); } @media (max-width: 640px) { .popover { top: 64px; } @media (max-height: 500px) { .popover { opacity: 0; } } } /** * Modals */ .modal { display: flex; position: fixed; justify-content: center; align-items: center; left: 0; top: 0; padding-inline: 8px; width: 100%; /* Full width */ height: 100%; /* Full height */ overflow: auto; /* Enable scroll if needed */ } .modal-backdrop { position: fixed; z-index: 2; inset: 0; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.4); animation: fadeIn 0.3s ease; } .modal-body { display: flex; flex-direction: column; gap: 8px; z-index: 3; max-width: 420px; background-color: var(--discord-bg); border-radius: 8px; padding: 16px; box-sizing: border-box; animation: slideInBottom 0.2s ease; } .modal-header { font-size: 18px; font-weight: 600; } .modal-content { color: hsla(var(--mono-100), 0.6); } .modal-footer { width: 100%; display: flex; justify-content: flex-end; } .modal-button { border-radius: 4px; background-color: hsl(var(--mono-500)); color: hsl(var(--mono-100)); padding: 8px 16px; flex-shrink: 0; width: unset; height: unset; } ================================================ FILE: src/static/mitf/index.html ================================================ 局部绘画组件

    Drag to select the area to be changed
    ================================================ FILE: src/store/helper.ts ================================================ import { createPinia } from 'pinia' export const store = createPinia() ================================================ FILE: src/store/homeStore.ts ================================================ import { gptsType, mlog } from '@/api'; import { reactive } from 'vue' import { ss } from '@/utils/storage' export const homeStore = reactive({ myData:{ act:'',//动作 act2:'',//动作 actData:{} //动作类别 ,local:'' //当前所处的版本 ,session:{} as any ,isLoader:false ,vtoken:'' //turnstile token ,ctoken:'' //cookie ,isClient: typeof window !== 'undefined' && window.__TAURI__ ,ms:{} as any ,is_luma_pro:false ,is_viggle_pro:false } ,setMyData( v:object){ this.myData={...this.myData,...v}; if( Object.keys(v).indexOf('act')>-1){ setTimeout(()=> { this.myData.act='' this.myData.actData='' }, 2000 ); } if( Object.keys(v).indexOf('act2')>-1){ setTimeout(()=> { this.myData.act2='' this.myData.actData='' }, 500 ); } } }) export interface gptConfigType{ model:string max_tokens:number userModel?:string //自定义 talkCount:number //联系对话 systemMessage:string //自定义系统提示语 gpts?:gptsType uuid?:number temperature?:number // 随机性 : 值越大,回复越随机 top_p?:number // 核采样 : 与随机性类似,但不要和随机性一起更改 frequency_penalty?:number presence_penalty?:number tts_voice?:string //TTS 人物 } const getGptInt= ():gptConfigType =>{ let v:gptConfigType=getDefault(); let str = localStorage.getItem('gptConfigStore'); if(str){ let old = JSON.parse(str); if(old) v={...v,...old}; } return v; } const getDefault=()=>{ const amodel = homeStore.myData.session.amodel??'gpt-3.5-turbo' let v:gptConfigType={ model: amodel, max_tokens:1024, userModel:'', talkCount:10, systemMessage:'', temperature:0.5, top_p:1, presence_penalty:0, frequency_penalty:0, tts_voice:"alloy" } return v ; } export const gptConfigStore= reactive({ myData:getGptInt(), setMyData(v: Partial){ this.myData={...this.myData,...v}; //mlog('gptConfigStore', v ) if(v.model && !v.gpts) this.myData.gpts=undefined; localStorage.setItem('gptConfigStore', JSON.stringify( this.myData)); } ,setInit(){ this.setMyData(getDefault()); } }) export interface gptServerType{ OPENAI_API_KEY:string OPENAI_API_BASE_URL:string MJ_SERVER:string MJ_API_SECRET:string UPLOADER_URL:string MJ_CDN_WSRV?:boolean //wsrv.nl SUNO_SERVER:string SUNO_KEY:string LUMA_SERVER:string LUMA_KEY:string VIGGLE_SERVER:string VIGGLE_KEY:string RUNWAY_SERVER:string RUNWAY_KEY:string IDEO_SERVER:string IDEO_KEY:string KLING_SERVER:string KLING_KEY:string PIKA_SERVER:string PIKA_KEY:string UDIO_SERVER:string UDIO_KEY:string PIXVERSE_SERVER:string PIXVERSE_KEY:string RIFF_SERVER:string RIFF_KEY:string IS_SET_SYNC?:boolean GPTS_GX?:boolean IS_LUMA_PRO?:boolean RRUNWAY_VERSION?:string DRAW_TYPE?:string IS_VIGGLE_PRO?:boolean TAB_VIDEO?:string TTS_VOICE?:string REALTIME_SYSMSG?:string REALTIME_MODEL?:string REALTIME_IS_WHISPER?:boolean TAB_MUSIC?:string } const getServerDefault=()=>{ let v:gptServerType={ OPENAI_API_KEY:'', OPENAI_API_BASE_URL:'', MJ_SERVER:'', UPLOADER_URL:'', MJ_API_SECRET:'', SUNO_KEY:'', SUNO_SERVER:'', MJ_CDN_WSRV:false ,IS_SET_SYNC:true, LUMA_SERVER:'', LUMA_KEY:'', VIGGLE_SERVER:'', VIGGLE_KEY:'', TAB_VIDEO:'all', RUNWAY_SERVER:'', RUNWAY_KEY:'', IDEO_SERVER:'', IDEO_KEY:'', KLING_SERVER:'', KLING_KEY:'', PIKA_SERVER:'', PIKA_KEY:'', TTS_VOICE:'alloy', UDIO_SERVER:'', UDIO_KEY:'', PIXVERSE_SERVER:'', PIXVERSE_KEY:'' } return v ; } const getServerInit= ():gptServerType =>{ let v:gptServerType=getServerDefault(); let str = localStorage.getItem('gptServerStore'); if(str){ let old = JSON.parse(str); if(old) v={...v,...old}; } return v; } export const gptServerStore= reactive({ myData:getServerInit(), setMyData(v: Partial){ this.myData={...this.myData,...v}; localStorage.setItem('gptServerStore', JSON.stringify( this.myData)); } ,setInit(){ this.setMyData(getServerDefault()); } }) const gptsUlistInit= ():gptsType[]=>{ const lk= ss.get('gpts-use-list'); if( !lk) return []; return lk as gptsType[]; } //使用gtps列表 export const gptsUlistStore= reactive({ myData:gptsUlistInit(), setMyData( v: gptsType){ this.myData= this.myData.filter( v2=> v2.gid!=v.gid ); this.myData.unshift(v); ss.set('gpts-use-list', this.myData ); return this; } }); ================================================ FILE: src/store/index.ts ================================================ import type { App } from 'vue' import { store } from './helper' export function setupStore(app: App) { app.use(store) } export * from './modules' export * from "./homeStore" ================================================ FILE: src/store/modules/app/helper.ts ================================================ import { homeStore } from '@/store/homeStore' import { ss } from '@/utils/storage' const LOCAL_NAME = 'appSetting' export type Theme = 'light' | 'dark' | 'auto' export type Language = 'zh-CN' | 'zh-TW' | 'en-US' | 'ko-KR' | 'ru-RU' | 'vi-VN' | 'fr-FR' | 'tr-TR' export interface AppState { siderCollapsed: boolean theme: Theme language: Language } export function defaultSetting(): AppState { const userLang = navigator.language || navigator.userLanguage; let content:Language= 'en-US'; if (userLang.startsWith('zh-HK') || userLang.startsWith('zh-TW')) { content = 'zh-TW'; // 繁体中文 } else if (userLang.startsWith('zh')) { content = 'zh-CN'; // 简体中文 } else if (userLang.startsWith('fr')) { content = 'fr-FR'; // 法语 } else if (userLang.startsWith('ko')) { content = 'ko-KR'; // 韩语 } else if (userLang.startsWith('ru')) { content = 'ru-RU'; // 俄文 } else if (userLang.startsWith('vi')) { content = 'vi-VN'; // 越南语 } else if (userLang.startsWith('tr')) { content = 'tr-TR'; // 土耳其语 } else { content = 'en-US'; // 英语 } return { siderCollapsed: false, theme: homeStore.myData.session.theme=='light'?'light': 'auto', language: content } } export function getLocalSetting(): AppState { const localSetting: AppState | undefined = ss.get(LOCAL_NAME) return { ...defaultSetting(), ...localSetting } } export function setLocalSetting(setting: AppState): void { ss.set(LOCAL_NAME, setting) } ================================================ FILE: src/store/modules/app/index.ts ================================================ import { defineStore } from 'pinia' import type { AppState, Language, Theme } from './helper' import { getLocalSetting, setLocalSetting } from './helper' import { store } from '@/store/helper' export const useAppStore = defineStore('app-store', { state: (): AppState => getLocalSetting(), actions: { setSiderCollapsed(collapsed: boolean) { this.siderCollapsed = collapsed this.recordState() }, setTheme(theme: Theme) { this.theme = theme this.recordState() }, setLanguage(language: Language) { if (this.language !== language) { this.language = language this.recordState() } }, recordState() { setLocalSetting(this.$state) }, }, }) export function useAppStoreWithOut() { return useAppStore(store) } ================================================ FILE: src/store/modules/auth/helper.ts ================================================ import { ss } from '@/utils/storage' const LOCAL_NAME = 'SECRET_TOKEN' export function getToken() { return ss.get(LOCAL_NAME) } export function setToken(token: string) { return ss.set(LOCAL_NAME, token) } export function removeToken() { return ss.remove(LOCAL_NAME) } ================================================ FILE: src/store/modules/auth/index.ts ================================================ import { defineStore } from 'pinia' import { getToken, removeToken, setToken } from './helper' import { store } from '@/store/helper' import { fetchSession } from '@/api' import { gptConfigStore, homeStore } from '@/store/homeStore' import { useAppStore } from '@/store' const appStore = useAppStore() interface SessionResponse { theme?: string auth: boolean model: 'ChatGPTAPI' | 'ChatGPTUnofficialProxyAPI' } export interface AuthState { token: string | undefined session: SessionResponse | null } export const useAuthStore = defineStore('auth-store', { state: (): AuthState => ({ token: getToken(), session: null, }), getters: { isChatGPTAPI(state): boolean { return state.session?.model === 'ChatGPTAPI' }, }, actions: { async getSession() { try { const { data } = await fetchSession() this.session = { ...data } homeStore.setMyData({session: data }); if(appStore.$state.theme=='auto' ){ appStore.setTheme( data.theme && data.theme=='light' ?'light':'dark') } let str = localStorage.getItem('gptConfigStore'); if( ! str ) setTimeout( ()=> gptConfigStore.setInit() , 500); return Promise.resolve(data) } catch (error) { return Promise.reject(error) } }, setToken(token: string) { this.token = token setToken(token) }, removeToken() { this.token = undefined removeToken() }, }, }) export function useAuthStoreWithout() { return useAuthStore(store) } ================================================ FILE: src/store/modules/chat/helper.ts ================================================ import { ss } from '@/utils/storage' const LOCAL_NAME = 'chatStorage' export function defaultState(): Chat.ChatState { const uuid = 1002 return { active: uuid, usingContext: true, history: [{ uuid, title: 'New Chat', isEdit: false }], chat: [{ uuid, data: [] }], } } export function getLocalState(): Chat.ChatState { const localState = ss.get(LOCAL_NAME) return { ...defaultState(), ...localState } } export function setLocalState(state: Chat.ChatState) { ss.set(LOCAL_NAME, state) } ================================================ FILE: src/store/modules/chat/index.ts ================================================ import { defineStore } from 'pinia' import { defaultState, getLocalState, setLocalState } from './helper' import { router } from '@/router' import { homeStore } from '@/store/homeStore' import { sleep } from '@/api/suno' import { mlog } from '@/api' export const useChatStore = defineStore('chat-store', { state: (): Chat.ChatState => getLocalState(), getters: { getChatHistoryByCurrentActive(state: Chat.ChatState) { const index = state.history.findIndex(item => item.uuid === state.active) if (index !== -1) return state.history[index] return null }, getChatByUuid(state: Chat.ChatState) { return (uuid?: number) => { if (uuid) return state.chat.find(item => item.uuid === uuid)?.data ?? [] return state.chat.find(item => item.uuid === state.active)?.data ?? [] } }, }, actions: { setUsingContext(context: boolean) { this.usingContext = context this.recordState() }, addHistory(history: Chat.History, chatData: Chat.Chat[] = []) { this.history.unshift(history) this.chat.unshift({ uuid: history.uuid, data: chatData }) this.active = history.uuid this.reloadRoute(history.uuid) }, updateHistory(uuid: number, edit: Partial) { const index = this.history.findIndex(item => item.uuid === uuid) if (index !== -1) { this.history[index] = { ...this.history[index], ...edit } this.recordState() } }, async deleteHistory(index: number) { this.history.splice(index, 1) this.chat.splice(index, 1) if (this.history.length === 0) { this.active = null this.reloadRoute() return } if (index > 0 && index <= this.history.length) { const uuid = this.history[index - 1].uuid this.active = uuid this.reloadRoute(uuid) return } if (index === 0) { if (this.history.length > 0) { const uuid = this.history[0].uuid this.active = uuid this.reloadRoute(uuid) } } if (index > this.history.length) { const uuid = this.history[this.history.length - 1].uuid this.active = uuid this.reloadRoute(uuid) } }, async setActive(uuid: number) { this.active = uuid return await this.reloadRoute(uuid) }, getChatByUuidAndIndex(uuid: number, index: number) { if (!uuid || uuid === 0) { if (this.chat.length) return this.chat[0].data[index] return null } const chatIndex = this.chat.findIndex(item => item.uuid === uuid) if (chatIndex !== -1) return this.chat[chatIndex].data[index] return null }, addChatByUuid(uuid: number, chat: Chat.Chat) { if (!uuid || uuid === 0) { if (this.history.length === 0) { const uuid = Date.now() this.history.push({ uuid, title: chat.text, isEdit: false }) this.chat.push({ uuid, data: [chat] }) this.active = uuid this.recordState() } else { this.chat[0].data.push(chat) if (this.history[0].title === 'New Chat') this.history[0].title = chat.text this.recordState() } } const index = this.chat.findIndex(item => item.uuid === uuid) if (index !== -1) { this.chat[index].data.push(chat) if (this.history[index].title === 'New Chat') this.history[index].title = chat.text this.recordState() } }, updateChatByUuid(uuid: number, index: number, chat: Chat.Chat) { if (!uuid || uuid === 0) { if (this.chat.length) { this.chat[0].data[index] = chat this.recordState() } return } const chatIndex = this.chat.findIndex(item => item.uuid === uuid) if (chatIndex !== -1) { this.chat[chatIndex].data[index] = chat this.recordState() } }, updateChatSomeByUuid(uuid: number, index: number, chat: Partial) { if (!uuid || uuid === 0) { if (this.chat.length) { this.chat[0].data[index] = { ...this.chat[0].data[index], ...chat } this.recordState() } return } const chatIndex = this.chat.findIndex(item => item.uuid === uuid) if (chatIndex !== -1) { this.chat[chatIndex].data[index] = { ...this.chat[chatIndex].data[index], ...chat } this.recordState() } }, deleteChatByUuid(uuid: number, index: number) { if (!uuid || uuid === 0) { if (this.chat.length) { this.chat[0].data.splice(index, 1) this.recordState() } return } const chatIndex = this.chat.findIndex(item => item.uuid === uuid) if (chatIndex !== -1) { this.chat[chatIndex].data.splice(index, 1) this.recordState() } }, clearChatByUuid(uuid: number) { if (!uuid || uuid === 0) { if (this.chat.length) { this.chat[0].data = [] this.recordState() } return } const index = this.chat.findIndex(item => item.uuid === uuid) if (index !== -1) { this.chat[index].data = [] this.recordState() } //清空标题 const i2= this.history.findIndex( v=>v.uuid===uuid ) if (i2 !== -1) { this.history[i2].title= "New Chat" this.recordState() } //end 清空标题 }, clearHistory() { this.$state = { ...defaultState() } this.recordState() }, async reloadRoute(uuid?: number) { this.recordState(); mlog('toMyuid19','reloadRoute') //await sleep(1000) await router.push({ name: homeStore.myData.local=='draw'?'draw': 'Chat', params: { uuid } }) }, recordState() { setLocalState(this.$state) }, }, }) ================================================ FILE: src/store/modules/index.ts ================================================ export * from './app' export * from './chat' export * from './user' export * from './prompt' export * from './settings' export * from './auth' ================================================ FILE: src/store/modules/prompt/helper.ts ================================================ import { ss } from '@/utils/storage' const LOCAL_NAME = 'promptStore' export type PromptList = [] export interface PromptStore { promptList: PromptList } export function getLocalPromptList(): PromptStore { const promptStore: PromptStore | undefined = ss.get(LOCAL_NAME) return promptStore ?? { promptList: [] } } export function setLocalPromptList(promptStore: PromptStore): void { ss.set(LOCAL_NAME, promptStore) } ================================================ FILE: src/store/modules/prompt/index.ts ================================================ import { defineStore } from 'pinia' import type { PromptStore } from './helper' import { getLocalPromptList, setLocalPromptList } from './helper' export const usePromptStore = defineStore('prompt-store', { state: (): PromptStore => getLocalPromptList(), actions: { updatePromptList(promptList: []) { this.$patch({ promptList }) setLocalPromptList({ promptList }) }, getPromptList() { return this.$state }, }, }) ================================================ FILE: src/store/modules/settings/helper.ts ================================================ import { ss } from '@/utils/storage' const LOCAL_NAME = 'settingsStorage' export interface SettingsState { systemMessage: string temperature: number top_p: number } export function defaultSetting(): SettingsState { return { systemMessage: 'You are ChatGPT, a large language model trained by OpenAI. Follow the user\'s instructions carefully. Respond using markdown.', temperature: 0.8, top_p: 1, } } export function getLocalState(): SettingsState { const localSetting: SettingsState | undefined = ss.get(LOCAL_NAME) return { ...defaultSetting(), ...localSetting } } export function setLocalState(setting: SettingsState): void { ss.set(LOCAL_NAME, setting) } export function removeLocalState() { ss.remove(LOCAL_NAME) } ================================================ FILE: src/store/modules/settings/index.ts ================================================ import { defineStore } from 'pinia' import type { SettingsState } from './helper' import { defaultSetting, getLocalState, removeLocalState, setLocalState } from './helper' export const useSettingStore = defineStore('setting-store', { state: (): SettingsState => getLocalState(), actions: { updateSetting(settings: Partial) { this.$state = { ...this.$state, ...settings } this.recordState() }, resetSetting() { this.$state = defaultSetting() removeLocalState() }, recordState() { setLocalState(this.$state) }, }, }) ================================================ FILE: src/store/modules/user/helper.ts ================================================ import { ss } from '@/utils/storage' import { t } from '@/locales' import { homeStore } from "@/store"; const LOCAL_NAME = 'userStorage' const backgroundImage = homeStore.myData.session.backgroundImage ?? "https://t.alcy.cc/fj/" export interface UserInfo { avatar: string name: string backgroundImage: string description: string } export interface UserState { userInfo: UserInfo } export function defaultSetting(): UserState { return { userInfo: { avatar: 'https://raw.githubusercontent.com/Dooy/chatgpt-web-midjourney-proxy/main/src/assets/avatar.jpg', name: t('mjset.sysname'),//'AI绘图', description: 'Star on
    GitHub', }, } } export function getLocalState(): UserState { const localSetting: UserState | undefined = ss.get(LOCAL_NAME) return { ...defaultSetting(), ...localSetting } } export function setLocalState(setting: UserState): void { ss.set(LOCAL_NAME, setting) } ================================================ FILE: src/store/modules/user/index.ts ================================================ import { defineStore } from 'pinia' import type { UserInfo, UserState } from './helper' import { defaultSetting, getLocalState, setLocalState } from './helper' export const useUserStore = defineStore('user-store', { state: (): UserState => getLocalState(), actions: { updateUserInfo(userInfo: Partial) { this.userInfo = { ...this.userInfo, ...userInfo } this.recordState() }, resetUserInfo() { this.userInfo = { ...defaultSetting().userInfo } this.recordState() }, recordState() { setLocalState(this.$state) }, }, }) ================================================ FILE: src/styles/global.less ================================================ html, body, #app { height: 100%; } body { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } .active{ color: #4b9e5f!important; } ================================================ FILE: src/styles/lib/github-markdown.less ================================================ html.dark { .markdown-body { color-scheme: dark; --color-prettylights-syntax-comment: #8b949e; --color-prettylights-syntax-constant: #79c0ff; --color-prettylights-syntax-entity: #d2a8ff; --color-prettylights-syntax-storage-modifier-import: #c9d1d9; --color-prettylights-syntax-entity-tag: #7ee787; --color-prettylights-syntax-keyword: #ff7b72; --color-prettylights-syntax-string: #a5d6ff; --color-prettylights-syntax-variable: #ffa657; --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; --color-prettylights-syntax-invalid-illegal-bg: #8e1519; --color-prettylights-syntax-carriage-return-text: #f0f6fc; --color-prettylights-syntax-carriage-return-bg: #b62324; --color-prettylights-syntax-string-regexp: #7ee787; --color-prettylights-syntax-markup-list: #f2cc60; --color-prettylights-syntax-markup-heading: #1f6feb; --color-prettylights-syntax-markup-italic: #c9d1d9; --color-prettylights-syntax-markup-bold: #c9d1d9; --color-prettylights-syntax-markup-deleted-text: #ffdcd7; --color-prettylights-syntax-markup-deleted-bg: #67060c; --color-prettylights-syntax-markup-inserted-text: #aff5b4; --color-prettylights-syntax-markup-inserted-bg: #033a16; --color-prettylights-syntax-markup-changed-text: #ffdfb6; --color-prettylights-syntax-markup-changed-bg: #5a1e02; --color-prettylights-syntax-markup-ignored-text: #c9d1d9; --color-prettylights-syntax-markup-ignored-bg: #1158c7; --color-prettylights-syntax-meta-diff-range: #d2a8ff; --color-prettylights-syntax-brackethighlighter-angle: #8b949e; --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; --color-fg-default: #c9d1d9; --color-fg-muted: #8b949e; --color-fg-subtle: #6e7681; --color-canvas-default: #0d1117; --color-canvas-subtle: #161b22; --color-border-default: #30363d; --color-border-muted: #21262d; --color-neutral-muted: rgba(110,118,129,0.4); --color-accent-fg: #58a6ff; --color-accent-emphasis: #1f6feb; --color-attention-subtle: rgba(187,128,9,0.15); --color-danger-fg: #f85149; } } html { .markdown-body { color-scheme: light; --color-prettylights-syntax-comment: #6e7781; --color-prettylights-syntax-constant: #0550ae; --color-prettylights-syntax-entity: #8250df; --color-prettylights-syntax-storage-modifier-import: #24292f; --color-prettylights-syntax-entity-tag: #116329; --color-prettylights-syntax-keyword: #cf222e; --color-prettylights-syntax-string: #0a3069; --color-prettylights-syntax-variable: #953800; --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; --color-prettylights-syntax-invalid-illegal-bg: #82071e; --color-prettylights-syntax-carriage-return-text: #f6f8fa; --color-prettylights-syntax-carriage-return-bg: #cf222e; --color-prettylights-syntax-string-regexp: #116329; --color-prettylights-syntax-markup-list: #3b2300; --color-prettylights-syntax-markup-heading: #0550ae; --color-prettylights-syntax-markup-italic: #24292f; --color-prettylights-syntax-markup-bold: #24292f; --color-prettylights-syntax-markup-deleted-text: #82071e; --color-prettylights-syntax-markup-deleted-bg: #ffebe9; --color-prettylights-syntax-markup-inserted-text: #116329; --color-prettylights-syntax-markup-inserted-bg: #dafbe1; --color-prettylights-syntax-markup-changed-text: #953800; --color-prettylights-syntax-markup-changed-bg: #ffd8b5; --color-prettylights-syntax-markup-ignored-text: #eaeef2; --color-prettylights-syntax-markup-ignored-bg: #0550ae; --color-prettylights-syntax-meta-diff-range: #8250df; --color-prettylights-syntax-brackethighlighter-angle: #57606a; --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; --color-prettylights-syntax-constant-other-reference-link: #0a3069; --color-fg-default: #24292f; --color-fg-muted: #57606a; --color-fg-subtle: #6e7781; --color-canvas-default: #ffffff; --color-canvas-subtle: #f6f8fa; --color-border-default: #d0d7de; --color-border-muted: hsla(210,18%,87%,1); --color-neutral-muted: rgba(175,184,193,0.2); --color-accent-fg: #0969da; --color-accent-emphasis: #0969da; --color-attention-subtle: #fff8c5; --color-danger-fg: #cf222e; } } .markdown-body { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; margin: 0; color: var(--color-fg-default); background-color: var(--color-canvas-default); font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; font-size: 16px; line-height: 1.5; word-wrap: break-word; } .markdown-body .octicon { display: inline-block; fill: currentColor; vertical-align: text-bottom; } .markdown-body h1:hover .anchor .octicon-link:before, .markdown-body h2:hover .anchor .octicon-link:before, .markdown-body h3:hover .anchor .octicon-link:before, .markdown-body h4:hover .anchor .octicon-link:before, .markdown-body h5:hover .anchor .octicon-link:before, .markdown-body h6:hover .anchor .octicon-link:before { width: 16px; height: 16px; content: ' '; display: inline-block; background-color: currentColor; -webkit-mask-image: url("data:image/svg+xml,"); mask-image: url("data:image/svg+xml,"); } .markdown-body details, .markdown-body figcaption, .markdown-body figure { display: block; } .markdown-body summary { display: list-item; } .markdown-body [hidden] { display: none !important; } .markdown-body a { background-color: transparent; color: var(--color-accent-fg); text-decoration: none; } .markdown-body abbr[title] { border-bottom: none; text-decoration: underline dotted; } .markdown-body b, .markdown-body strong { font-weight: var(--base-text-weight-semibold, 600); } .markdown-body dfn { font-style: italic; } .markdown-body h1 { margin: .67em 0; font-weight: var(--base-text-weight-semibold, 600); padding-bottom: .3em; font-size: 2em; border-bottom: 1px solid var(--color-border-muted); } .markdown-body mark { background-color: var(--color-attention-subtle); color: var(--color-fg-default); } .markdown-body small { font-size: 90%; } .markdown-body sub, .markdown-body sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } .markdown-body sub { bottom: -0.25em; } .markdown-body sup { top: -0.5em; } .markdown-body img { border-style: none; max-width: 100%; box-sizing: content-box; background-color: var(--color-canvas-default); } .markdown-body code, .markdown-body kbd, .markdown-body pre, .markdown-body samp { font-family: monospace; font-size: 1em; } .markdown-body figure { margin: 1em 40px; } .markdown-body hr { box-sizing: content-box; overflow: hidden; background: transparent; border-bottom: 1px solid var(--color-border-muted); height: .25em; padding: 0; margin: 24px 0; background-color: var(--color-border-default); border: 0; } .markdown-body input { font: inherit; margin: 0; overflow: visible; font-family: inherit; font-size: inherit; line-height: inherit; } .markdown-body [type=button], .markdown-body [type=reset], .markdown-body [type=submit] { -webkit-appearance: button; } .markdown-body [type=checkbox], .markdown-body [type=radio] { box-sizing: border-box; padding: 0; } .markdown-body [type=number]::-webkit-inner-spin-button, .markdown-body [type=number]::-webkit-outer-spin-button { height: auto; } .markdown-body [type=search]::-webkit-search-cancel-button, .markdown-body [type=search]::-webkit-search-decoration { -webkit-appearance: none; } .markdown-body ::-webkit-input-placeholder { color: inherit; opacity: .54; } .markdown-body ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } .markdown-body a:hover { text-decoration: underline; } .markdown-body ::placeholder { color: var(--color-fg-subtle); opacity: 1; } .markdown-body hr::before { display: table; content: ""; } .markdown-body hr::after { display: table; clear: both; content: ""; } .markdown-body table { border-spacing: 0; border-collapse: collapse; display: block; width: max-content; max-width: 100%; overflow: auto; } .markdown-body td, .markdown-body th { padding: 0; } .markdown-body details summary { cursor: pointer; } .markdown-body details:not([open])>*:not(summary) { display: none !important; } .markdown-body a:focus, .markdown-body [role=button]:focus, .markdown-body input[type=radio]:focus, .markdown-body input[type=checkbox]:focus { outline: 2px solid var(--color-accent-fg); outline-offset: -2px; box-shadow: none; } .markdown-body a:focus:not(:focus-visible), .markdown-body [role=button]:focus:not(:focus-visible), .markdown-body input[type=radio]:focus:not(:focus-visible), .markdown-body input[type=checkbox]:focus:not(:focus-visible) { outline: solid 1px transparent; } .markdown-body a:focus-visible, .markdown-body [role=button]:focus-visible, .markdown-body input[type=radio]:focus-visible, .markdown-body input[type=checkbox]:focus-visible { outline: 2px solid var(--color-accent-fg); outline-offset: -2px; box-shadow: none; } .markdown-body a:not([class]):focus, .markdown-body a:not([class]):focus-visible, .markdown-body input[type=radio]:focus, .markdown-body input[type=radio]:focus-visible, .markdown-body input[type=checkbox]:focus, .markdown-body input[type=checkbox]:focus-visible { outline-offset: 0; } .markdown-body kbd { display: inline-block; padding: 3px 5px; font: 11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; line-height: 10px; color: var(--color-fg-default); vertical-align: middle; background-color: var(--color-canvas-subtle); border: solid 1px var(--color-neutral-muted); border-bottom-color: var(--color-neutral-muted); border-radius: 6px; box-shadow: inset 0 -1px 0 var(--color-neutral-muted); } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin-top: 24px; margin-bottom: 16px; font-weight: var(--base-text-weight-semibold, 600); line-height: 1.25; } .markdown-body h2 { font-weight: var(--base-text-weight-semibold, 600); padding-bottom: .3em; font-size: 1.5em; border-bottom: 1px solid var(--color-border-muted); } .markdown-body h3 { font-weight: var(--base-text-weight-semibold, 600); font-size: 1.25em; } .markdown-body h4 { font-weight: var(--base-text-weight-semibold, 600); font-size: 1em; } .markdown-body h5 { font-weight: var(--base-text-weight-semibold, 600); font-size: .875em; } .markdown-body h6 { font-weight: var(--base-text-weight-semibold, 600); font-size: .85em; color: var(--color-fg-muted); } .markdown-body p { margin-top: 0; margin-bottom: 10px; } .markdown-body blockquote { margin: 0; padding: 0 1em; color: var(--color-fg-muted); border-left: .25em solid var(--color-border-default); } .markdown-body ul, .markdown-body ol { margin-top: 0; margin-bottom: 0; padding-left: 2em; } .markdown-body ol ol, .markdown-body ul ol { list-style-type: lower-roman; } .markdown-body ul ul ol, .markdown-body ul ol ol, .markdown-body ol ul ol, .markdown-body ol ol ol { list-style-type: lower-alpha; } .markdown-body dd { margin-left: 0; } .markdown-body tt, .markdown-body code, .markdown-body samp { font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; font-size: 12px; } .markdown-body pre { margin-top: 0; margin-bottom: 0; font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; font-size: 12px; word-wrap: normal; } .markdown-body .octicon { display: inline-block; overflow: visible !important; vertical-align: text-bottom; fill: currentColor; } .markdown-body input::-webkit-outer-spin-button, .markdown-body input::-webkit-inner-spin-button { margin: 0; -webkit-appearance: none; appearance: none; } .markdown-body::before { display: table; content: ""; } .markdown-body::after { display: table; clear: both; content: ""; } .markdown-body>*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none; } .markdown-body .absent { color: var(--color-danger-fg); } .markdown-body .anchor { float: left; padding-right: 4px; margin-left: -20px; line-height: 1; } .markdown-body .anchor:focus { outline: none; } .markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre, .markdown-body details { margin-top: 0; margin-bottom: 16px; } .markdown-body blockquote>:first-child { margin-top: 0; } .markdown-body blockquote>:last-child { margin-bottom: 0; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: var(--color-fg-default); vertical-align: middle; visibility: hidden; } .markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor { text-decoration: none; } .markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link { visibility: visible; } .markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { padding: 0 .2em; font-size: inherit; } .markdown-body summary h1, .markdown-body summary h2, .markdown-body summary h3, .markdown-body summary h4, .markdown-body summary h5, .markdown-body summary h6 { display: inline-block; } .markdown-body summary h1 .anchor, .markdown-body summary h2 .anchor, .markdown-body summary h3 .anchor, .markdown-body summary h4 .anchor, .markdown-body summary h5 .anchor, .markdown-body summary h6 .anchor { margin-left: -40px; } .markdown-body summary h1, .markdown-body summary h2 { padding-bottom: 0; border-bottom: 0; } .markdown-body ul.no-list, .markdown-body ol.no-list { padding: 0; list-style-type: none; } .markdown-body ol[type=a] { list-style-type: lower-alpha; } .markdown-body ol[type=A] { list-style-type: upper-alpha; } .markdown-body ol[type=i] { list-style-type: lower-roman; } .markdown-body ol[type=I] { list-style-type: upper-roman; } .markdown-body ol[type="1"] { list-style-type: decimal; } .markdown-body div>ol:not([type]) { list-style-type: decimal; } .markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { margin-top: 0; margin-bottom: 0; } .markdown-body li>p { margin-top: 16px; } .markdown-body li+li { margin-top: .25em; } .markdown-body dl { padding: 0; } .markdown-body dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: var(--base-text-weight-semibold, 600); } .markdown-body dl dd { padding: 0 16px; margin-bottom: 16px; } .markdown-body table th { font-weight: var(--base-text-weight-semibold, 600); } .markdown-body table th, .markdown-body table td { padding: 6px 13px; border: 1px solid var(--color-border-default); } .markdown-body table tr { background-color: var(--color-canvas-default); border-top: 1px solid var(--color-border-muted); } .markdown-body table tr:nth-child(2n) { background-color: var(--color-canvas-subtle); } .markdown-body table img { background-color: transparent; } .markdown-body img[align=right] { padding-left: 20px; } .markdown-body img[align=left] { padding-right: 20px; } .markdown-body .emoji { max-width: none; vertical-align: text-top; background-color: transparent; } .markdown-body span.frame { display: block; overflow: hidden; } .markdown-body span.frame>span { display: block; float: left; width: auto; padding: 7px; margin: 13px 0 0; overflow: hidden; border: 1px solid var(--color-border-default); } .markdown-body span.frame span img { display: block; float: left; } .markdown-body span.frame span span { display: block; padding: 5px 0 0; clear: both; color: var(--color-fg-default); } .markdown-body span.align-center { display: block; overflow: hidden; clear: both; } .markdown-body span.align-center>span { display: block; margin: 13px auto 0; overflow: hidden; text-align: center; } .markdown-body span.align-center span img { margin: 0 auto; text-align: center; } .markdown-body span.align-right { display: block; overflow: hidden; clear: both; } .markdown-body span.align-right>span { display: block; margin: 13px 0 0; overflow: hidden; text-align: right; } .markdown-body span.align-right span img { margin: 0; text-align: right; } .markdown-body span.float-left { display: block; float: left; margin-right: 13px; overflow: hidden; } .markdown-body span.float-left span { margin: 13px 0 0; } .markdown-body span.float-right { display: block; float: right; margin-left: 13px; overflow: hidden; } .markdown-body span.float-right>span { display: block; margin: 13px auto 0; overflow: hidden; text-align: right; } .markdown-body code, .markdown-body tt { padding: .2em .4em; margin: 0; font-size: 85%; white-space: break-spaces; background-color: var(--color-neutral-muted); border-radius: 6px; } .markdown-body code br, .markdown-body tt br { display: none; } .markdown-body del code { text-decoration: inherit; } .markdown-body samp { font-size: 85%; } .markdown-body pre code { font-size: 100%; } .markdown-body pre>code { padding: 0; margin: 0; word-break: normal; white-space: pre; background: transparent; border: 0; } .markdown-body .highlight { margin-bottom: 16px; } .markdown-body .highlight pre { margin-bottom: 0; word-break: normal; } .markdown-body .highlight pre, .markdown-body pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: var(--color-canvas-subtle); border-radius: 6px; } .markdown-body pre code, .markdown-body pre tt { display: inline; max-width: auto; padding: 0; margin: 0; overflow: visible; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } .markdown-body .csv-data td, .markdown-body .csv-data th { padding: 5px; overflow: hidden; font-size: 12px; line-height: 1; text-align: left; white-space: nowrap; } .markdown-body .csv-data .blob-num { padding: 10px 8px 9px; text-align: right; background: var(--color-canvas-default); border: 0; } .markdown-body .csv-data tr { border-top: 0; } .markdown-body .csv-data th { font-weight: var(--base-text-weight-semibold, 600); background: var(--color-canvas-subtle); border-top: 0; } .markdown-body [data-footnote-ref]::before { content: "["; } .markdown-body [data-footnote-ref]::after { content: "]"; } .markdown-body .footnotes { font-size: 12px; color: var(--color-fg-muted); border-top: 1px solid var(--color-border-default); } .markdown-body .footnotes ol { padding-left: 16px; } .markdown-body .footnotes ol ul { display: inline-block; padding-left: 16px; margin-top: 16px; } .markdown-body .footnotes li { position: relative; } .markdown-body .footnotes li:target::before { position: absolute; top: -8px; right: -8px; bottom: -8px; left: -24px; pointer-events: none; content: ""; border: 2px solid var(--color-accent-emphasis); border-radius: 6px; } .markdown-body .footnotes li:target { color: var(--color-fg-default); } .markdown-body .footnotes .data-footnote-backref g-emoji { font-family: monospace; } .markdown-body .pl-c { color: var(--color-prettylights-syntax-comment); } .markdown-body .pl-c1, .markdown-body .pl-s .pl-v { color: var(--color-prettylights-syntax-constant); } .markdown-body .pl-e, .markdown-body .pl-en { color: var(--color-prettylights-syntax-entity); } .markdown-body .pl-smi, .markdown-body .pl-s .pl-s1 { color: var(--color-prettylights-syntax-storage-modifier-import); } .markdown-body .pl-ent { color: var(--color-prettylights-syntax-entity-tag); } .markdown-body .pl-k { color: var(--color-prettylights-syntax-keyword); } .markdown-body .pl-s, .markdown-body .pl-pds, .markdown-body .pl-s .pl-pse .pl-s1, .markdown-body .pl-sr, .markdown-body .pl-sr .pl-cce, .markdown-body .pl-sr .pl-sre, .markdown-body .pl-sr .pl-sra { color: var(--color-prettylights-syntax-string); } .markdown-body .pl-v, .markdown-body .pl-smw { color: var(--color-prettylights-syntax-variable); } .markdown-body .pl-bu { color: var(--color-prettylights-syntax-brackethighlighter-unmatched); } .markdown-body .pl-ii { color: var(--color-prettylights-syntax-invalid-illegal-text); background-color: var(--color-prettylights-syntax-invalid-illegal-bg); } .markdown-body .pl-c2 { color: var(--color-prettylights-syntax-carriage-return-text); background-color: var(--color-prettylights-syntax-carriage-return-bg); } .markdown-body .pl-sr .pl-cce { font-weight: bold; color: var(--color-prettylights-syntax-string-regexp); } .markdown-body .pl-ml { color: var(--color-prettylights-syntax-markup-list); } .markdown-body .pl-mh, .markdown-body .pl-mh .pl-en, .markdown-body .pl-ms { font-weight: bold; color: var(--color-prettylights-syntax-markup-heading); } .markdown-body .pl-mi { font-style: italic; color: var(--color-prettylights-syntax-markup-italic); } .markdown-body .pl-mb { font-weight: bold; color: var(--color-prettylights-syntax-markup-bold); } .markdown-body .pl-md { color: var(--color-prettylights-syntax-markup-deleted-text); background-color: var(--color-prettylights-syntax-markup-deleted-bg); } .markdown-body .pl-mi1 { color: var(--color-prettylights-syntax-markup-inserted-text); background-color: var(--color-prettylights-syntax-markup-inserted-bg); } .markdown-body .pl-mc { color: var(--color-prettylights-syntax-markup-changed-text); background-color: var(--color-prettylights-syntax-markup-changed-bg); } .markdown-body .pl-mi2 { color: var(--color-prettylights-syntax-markup-ignored-text); background-color: var(--color-prettylights-syntax-markup-ignored-bg); } .markdown-body .pl-mdr { font-weight: bold; color: var(--color-prettylights-syntax-meta-diff-range); } .markdown-body .pl-ba { color: var(--color-prettylights-syntax-brackethighlighter-angle); } .markdown-body .pl-sg { color: var(--color-prettylights-syntax-sublimelinter-gutter-mark); } .markdown-body .pl-corl { text-decoration: underline; color: var(--color-prettylights-syntax-constant-other-reference-link); } .markdown-body g-emoji { display: inline-block; min-width: 1ch; font-family: "Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; font-size: 1em; font-style: normal !important; font-weight: var(--base-text-weight-normal, 400); line-height: 1; vertical-align: -0.075em; } .markdown-body g-emoji img { width: 1em; height: 1em; } .markdown-body .task-list-item { list-style-type: none; } .markdown-body .task-list-item label { font-weight: var(--base-text-weight-normal, 400); } .markdown-body .task-list-item.enabled label { cursor: pointer; } .markdown-body .task-list-item+.task-list-item { margin-top: 4px; } .markdown-body .task-list-item .handle { display: none; } .markdown-body .task-list-item-checkbox { margin: 0 .2em .25em -1.4em; vertical-align: middle; } .markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox { margin: 0 -1.6em .25em .2em; } .markdown-body .contains-task-list { position: relative; } .markdown-body .contains-task-list:hover .task-list-item-convert-container, .markdown-body .contains-task-list:focus-within .task-list-item-convert-container { display: block; width: auto; height: 24px; overflow: visible; clip: auto; } .markdown-body ::-webkit-calendar-picker-indicator { filter: invert(50%); } ================================================ FILE: src/styles/lib/highlight.less ================================================ html.dark { pre code.hljs { display: block; overflow-x: auto; padding: 1em } code.hljs { padding: 3px 5px } .hljs { color: #abb2bf; background: #282c34 } .hljs-keyword, .hljs-operator, .hljs-pattern-match { color: #f92672 } .hljs-function, .hljs-pattern-match .hljs-constructor { color: #61aeee } .hljs-function .hljs-params { color: #a6e22e } .hljs-function .hljs-params .hljs-typing { color: #fd971f } .hljs-module-access .hljs-module { color: #7e57c2 } .hljs-constructor { color: #e2b93d } .hljs-constructor .hljs-string { color: #9ccc65 } .hljs-comment, .hljs-quote { color: #b18eb1; font-style: italic } .hljs-doctag, .hljs-formula { color: #c678dd } .hljs-deletion, .hljs-name, .hljs-section, .hljs-selector-tag, .hljs-subst { color: #e06c75 } .hljs-literal { color: #56b6c2 } .hljs-addition, .hljs-attribute, .hljs-meta .hljs-string, .hljs-regexp, .hljs-string { color: #98c379 } .hljs-built_in, .hljs-class .hljs-title, .hljs-title.class_ { color: #e6c07b } .hljs-attr, .hljs-number, .hljs-selector-attr, .hljs-selector-class, .hljs-selector-pseudo, .hljs-template-variable, .hljs-type, .hljs-variable { color: #d19a66 } .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-symbol, .hljs-title { color: #61aeee } .hljs-emphasis { font-style: italic } .hljs-strong { font-weight: 700 } .hljs-link { text-decoration: underline } } html { pre code.hljs { display: block; overflow-x: auto; padding: 1em } code.hljs { padding: 3px 5px; &::-webkit-scrollbar { height: 4px; } } .hljs { color: #383a42; background: #fafafa } .hljs-comment, .hljs-quote { color: #a0a1a7; font-style: italic } .hljs-doctag, .hljs-formula, .hljs-keyword { color: #a626a4 } .hljs-deletion, .hljs-name, .hljs-section, .hljs-selector-tag, .hljs-subst { color: #e45649 } .hljs-literal { color: #0184bb } .hljs-addition, .hljs-attribute, .hljs-meta .hljs-string, .hljs-regexp, .hljs-string { color: #50a14f } .hljs-attr, .hljs-number, .hljs-selector-attr, .hljs-selector-class, .hljs-selector-pseudo, .hljs-template-variable, .hljs-type, .hljs-variable { color: #986801 } .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-symbol, .hljs-title { color: #4078f2 } .hljs-built_in, .hljs-class .hljs-title, .hljs-title.class_ { color: #c18401 } .hljs-emphasis { font-style: italic } .hljs-strong { font-weight: 700 } .hljs-link { text-decoration: underline } } ================================================ FILE: src/styles/lib/tailwind.css ================================================ @tailwind base; @tailwind components; @tailwind utilities; ================================================ FILE: src/typings/chat.d.ts ================================================ declare namespace Chat { interface VideoUrl{ url:string } interface Chat { dateTime: string text: string inversion?: boolean error?: boolean loading?: boolean conversationOptions?: ConversationRequest | null requestOptions: { prompt: string; options?: ConversationRequest | null } model?:string //模型 mjID?:string //MJ的ID opt?:{ progress?:string,seed?:number, imageUrl?:string , status?:string, images?:string[] ,promptEn?:string,buttons?:any[] ,action?:string ,duration?:number ,lkey?:string ,videoUrls?:VideoUrl[] ,imageUrls?:VideoUrl[] } // uuid?:number index?:number myid?:string //唯一随机 logo?:string //progress?:string } interface History { title: string isEdit: boolean uuid: number } interface ChatState { active: number | null usingContext: boolean; history: History[] chat: { uuid: number; data: Chat[] }[] } interface ConversationRequest { conversationId?: string parentMessageId?: string } interface ConversationResponse { conversationId: string detail: { choices: { finish_reason: string; index: number; logprobs: any; text: string }[] created: number id: string model: string object: string usage: { completion_tokens: number; prompt_tokens: number; total_tokens: number } } id: string parentMessageId: string role: string text: string } } ================================================ FILE: src/typings/env.d.ts ================================================ /// interface ImportMetaEnv { readonly VITE_GLOB_API_URL: string; readonly VITE_APP_API_BASE_URL: string; readonly VITE_GLOB_OPEN_LONG_REPLY: string; readonly VITE_GLOB_APP_PWA: string; } ================================================ FILE: src/typings/global.d.ts ================================================ interface Window { $loadingBar?: import('naive-ui').LoadingBarProviderInst; $dialog?: import('naive-ui').DialogProviderInst; $message?: import('naive-ui').MessageProviderInst; $notification?: import('naive-ui').NotificationProviderInst; } ================================================ FILE: src/utils/copy.ts ================================================ export function copyToClip(text: string) { return new Promise((resolve, reject) => { try { const input: HTMLTextAreaElement = document.createElement('textarea') input.setAttribute('readonly', 'readonly') input.value = text document.body.appendChild(input) input.select() if (document.execCommand('copy')) document.execCommand('copy') document.body.removeChild(input) resolve(text) } catch (error) { reject(error) } }) } ================================================ FILE: src/utils/functions/debounce.ts ================================================ type CallbackFunc = (...args: T) => void export function debounce( func: CallbackFunc, wait: number, ): (...args: T) => void { let timeoutId: ReturnType | undefined return (...args: T) => { const later = () => { clearTimeout(timeoutId) func(...args) } clearTimeout(timeoutId) timeoutId = setTimeout(later, wait) } } ================================================ FILE: src/utils/functions/index.ts ================================================ export function getCurrentDate() { const date = new Date() const day = date.getDate() const month = date.getMonth() + 1 const year = date.getFullYear() return `${year}-${month}-${day}` } ================================================ FILE: src/utils/is/index.ts ================================================ export function isNumber(value: T | unknown): value is number { return Object.prototype.toString.call(value) === '[object Number]' } export function isString(value: T | unknown): value is string { return Object.prototype.toString.call(value) === '[object String]' } export function isBoolean(value: T | unknown): value is boolean { return Object.prototype.toString.call(value) === '[object Boolean]' } export function isNull(value: T | unknown): value is null { return Object.prototype.toString.call(value) === '[object Null]' } export function isUndefined(value: T | unknown): value is undefined { return Object.prototype.toString.call(value) === '[object Undefined]' } export function isObject(value: T | unknown): value is object { return Object.prototype.toString.call(value) === '[object Object]' } export function isArray(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Array]' } export function isFunction any | void | never>(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Function]' } export function isDate(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Date]' } export function isRegExp(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object RegExp]' } export function isPromise>(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Promise]' } export function isSet>(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Set]' } export function isMap>(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object Map]' } export function isFile(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object File]' } ================================================ FILE: src/utils/request/axios.ts ================================================ import axios, { type AxiosResponse } from 'axios' import { useAuthStore } from '@/store' const service = axios.create({ baseURL: import.meta.env.VITE_GLOB_API_URL, }) service.interceptors.request.use( (config) => { const token = useAuthStore().token if (token) config.headers.Authorization = `Bearer ${token}` return config }, (error) => { return Promise.reject(error.response) }, ) service.interceptors.response.use( (response: AxiosResponse): AxiosResponse => { if (response.status === 200) return response throw new Error(response.status.toString()) }, (error) => { return Promise.reject(error) }, ) export default service ================================================ FILE: src/utils/request/index.ts ================================================ import type { AxiosProgressEvent, AxiosResponse, GenericAbortSignal } from 'axios' import request from './axios' import { useAuthStore } from '@/store' export interface HttpOption { url: string data?: any method?: string headers?: any onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void signal?: GenericAbortSignal beforeRequest?: () => void afterRequest?: () => void } export interface Response { data: T message: string | null status: string } function http( { url, data, method, headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ) { const successHandler = (res: AxiosResponse>) => { const authStore = useAuthStore() if (res.data.status === 'Success' || typeof res.data === 'string') return res.data if (res.data.status === 'Unauthorized') { authStore.removeToken() window.location.reload() } return Promise.reject(res.data) } const failHandler = (error: Response) => { afterRequest?.() throw new Error(error?.message || 'Error') } beforeRequest?.() method = method || 'GET' const params = Object.assign(typeof data === 'function' ? data() : data ?? {}, {}) return method === 'GET' ? request.get(url, { params, signal, onDownloadProgress }).then(successHandler, failHandler) : request.post(url, params, { headers, signal, onDownloadProgress }).then(successHandler, failHandler) } export function get( { url, data, method = 'GET', onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ): Promise> { return http({ url, method, data, onDownloadProgress, signal, beforeRequest, afterRequest, }) } export function post( { url, data, method = 'POST', headers, onDownloadProgress, signal, beforeRequest, afterRequest }: HttpOption, ): Promise> { return http({ url, method, data, headers, onDownloadProgress, signal, beforeRequest, afterRequest, }) } export default post ================================================ FILE: src/utils/storage/index.ts ================================================ interface StorageData { data: T expire: number | null } export function createLocalStorage(options?: { expire?: number | null }) { const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7 const { expire } = Object.assign({ expire: DEFAULT_CACHE_TIME }, options) function set(key: string, data: T) { const storageData: StorageData = { data, expire: expire !== null ? new Date().getTime() + expire * 1000 : null, } const json = JSON.stringify(storageData) window.localStorage.setItem(key, json) } function get(key: string) { const json = window.localStorage.getItem(key) if (json) { let storageData: StorageData | null = null try { storageData = JSON.parse(json) } catch { // Prevent failure } if (storageData) { const { data, expire } = storageData if (expire === null || expire >= Date.now()) return data } remove(key) return null } } function remove(key: string) { window.localStorage.removeItem(key) } function clear() { window.localStorage.clear() } return { set, get, remove, clear } } export const ls = createLocalStorage() export const ss = createLocalStorage({ expire: null }) ================================================ FILE: src/utils/wav_renderer.ts ================================================ const dataMap = new WeakMap(); /** * Normalizes a Float32Array to Array(m): We use this to draw amplitudes on a graph * If we're rendering the same audio data, then we'll often be using * the same (data, m, downsamplePeaks) triplets so we give option to memoize */ const normalizeArray = ( data: Float32Array, m: number, downsamplePeaks: boolean = false, memoize: boolean = false ) => { let cache, mKey, dKey; if (memoize) { mKey = m.toString(); dKey = downsamplePeaks.toString(); cache = dataMap.has(data) ? dataMap.get(data) : {}; dataMap.set(data, cache); cache[mKey] = cache[mKey] || {}; if (cache[mKey][dKey]) { return cache[mKey][dKey]; } } const n = data.length; const result = new Array(m); if (m <= n) { // Downsampling result.fill(0); const count = new Array(m).fill(0); for (let i = 0; i < n; i++) { const index = Math.floor(i * (m / n)); if (downsamplePeaks) { // take highest result in the set result[index] = Math.max(result[index], Math.abs(data[i])); } else { result[index] += Math.abs(data[i]); } count[index]++; } if (!downsamplePeaks) { for (let i = 0; i < result.length; i++) { result[i] = result[i] / count[i]; } } } else { for (let i = 0; i < m; i++) { const index = (i * (n - 1)) / (m - 1); const low = Math.floor(index); const high = Math.ceil(index); const t = index - low; if (high >= n) { result[i] = data[n - 1]; } else { result[i] = data[low] * (1 - t) + data[high] * t; } } } if (memoize) { cache[mKey as string][dKey as string] = result; } return result; }; export const WavRenderer = { /** * Renders a point-in-time snapshot of an audio sample, usually frequency values * @param canvas * @param ctx * @param data * @param color * @param pointCount number of bars to render * @param barWidth width of bars in px * @param barSpacing spacing between bars in px * @param center vertically center the bars */ drawBars: ( canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, data: Float32Array, color: string, pointCount: number = 0, barWidth: number = 0, barSpacing: number = 0, center: boolean = false ) => { pointCount = Math.floor( Math.min( pointCount, (canvas.width - barSpacing) / (Math.max(barWidth, 1) + barSpacing) ) ); if (!pointCount) { pointCount = Math.floor( (canvas.width - barSpacing) / (Math.max(barWidth, 1) + barSpacing) ); } if (!barWidth) { barWidth = (canvas.width - barSpacing) / pointCount - barSpacing; } const points = normalizeArray(data, pointCount, true); for (let i = 0; i < pointCount; i++) { const amplitude = Math.abs(points[i]); const height = Math.max(1, amplitude * canvas.height); const x = barSpacing + i * (barWidth + barSpacing); const y = center ? (canvas.height - height) / 2 : canvas.height - height; ctx.fillStyle = color; ctx.fillRect(x, y, barWidth, height); } }, }; ================================================ FILE: src/utils/webdav.ts ================================================ // WebDAV 同步工具 interface WebDAVConfig { url: string username: string password: string } const WEBDAV_CONFIG_KEY = 'webdav_config' const WEBDAV_FILE_NAME = 'chatgpt-backup.json' export function getWebDAVConfig(): WebDAVConfig | null { const config = localStorage.getItem(WEBDAV_CONFIG_KEY) return config ? JSON.parse(config) : null } export function saveWebDAVConfig(config: WebDAVConfig): void { localStorage.setItem(WEBDAV_CONFIG_KEY, JSON.stringify(config)) } async function webdavRequest(config: WebDAVConfig, method: string, data?: string) { const url = `${config.url.replace(/\/$/, '')}/${WEBDAV_FILE_NAME}` const res = await fetch('/api/webdav-proxy', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url, method, username: config.username, password: config.password, data }), }) const result = await res.json() if (!result.success) throw new Error(result.error || '请求失败') return result } export async function syncToWebDAV(): Promise { const config = getWebDAVConfig() if (!config) throw new Error('WebDAV 未配置') const data = localStorage.getItem('chatStorage') || '{}' // 尝试上传,如果失败尝试创建目录再上传 try { await webdavRequest(config, 'PUT', data) } catch (error: any) { if (error.message.includes('409')) { await fetch('/api/webdav-proxy', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: config.url.replace(/\/$/, ''), method: 'MKCOL', username: config.username, password: config.password, }), }) await webdavRequest(config, 'PUT', data) } else { throw error } } } export async function syncFromWebDAV(): Promise { const config = getWebDAVConfig() if (!config) throw new Error('WebDAV 未配置') const result = await webdavRequest(config, 'GET') try { localStorage.setItem('chatStorage', result.data || '{}') } catch { throw new Error('浏览器存储限制,请使用Chrome/Edge或手动导入文件') }} ================================================ FILE: src/views/chat/components/Header/index.vue ================================================ ================================================ FILE: src/views/chat/components/Message/Avatar.vue ================================================ ================================================ FILE: src/views/chat/components/Message/Text.vue ================================================ ================================================ FILE: src/views/chat/components/Message/index.vue ================================================ ================================================ FILE: src/views/chat/components/Message/style.less ================================================ .markdown-body { background-color: transparent; font-size: 14px; p { white-space: pre-wrap; } ol { list-style-type: decimal; } ul { list-style-type: disc; } img{ max-width: 400px; } pre code, pre tt { line-height: 1.65; } .highlight pre, pre { background-color: #fff; } code.hljs { padding: 0; } .code-block { &-wrapper { position: relative; padding-top: 24px; } &-header { position: absolute; top: 5px; right: 0; width: 100%; padding: 0 1rem; display: flex; justify-content: flex-end; align-items: center; color: #b3b3b3; &__copy { cursor: pointer; margin-left: 0.5rem; user-select: none; &:hover { color: #65a665; } } } } &.markdown-body-generate>dd:last-child:after, &.markdown-body-generate>dl:last-child:after, &.markdown-body-generate>dt:last-child:after, &.markdown-body-generate>h1:last-child:after, &.markdown-body-generate>h2:last-child:after, &.markdown-body-generate>h3:last-child:after, &.markdown-body-generate>h4:last-child:after, &.markdown-body-generate>h5:last-child:after, &.markdown-body-generate>h6:last-child:after, &.markdown-body-generate>li:last-child:after, &.markdown-body-generate>ol:last-child li:last-child:after, &.markdown-body-generate>p:last-child:after, &.markdown-body-generate>pre:last-child code:after, &.markdown-body-generate>td:last-child:after, &.markdown-body-generate>ul:last-child li:last-child:after { animation: blink 1s steps(5, start) infinite; color: #000; content: '_'; font-weight: 700; margin-left: 3px; vertical-align: baseline; } @keyframes blink { to { visibility: hidden; } } } html.dark { .markdown-body { &.markdown-body-generate>dd:last-child:after, &.markdown-body-generate>dl:last-child:after, &.markdown-body-generate>dt:last-child:after, &.markdown-body-generate>h1:last-child:after, &.markdown-body-generate>h2:last-child:after, &.markdown-body-generate>h3:last-child:after, &.markdown-body-generate>h4:last-child:after, &.markdown-body-generate>h5:last-child:after, &.markdown-body-generate>h6:last-child:after, &.markdown-body-generate>li:last-child:after, &.markdown-body-generate>ol:last-child li:last-child:after, &.markdown-body-generate>p:last-child:after, &.markdown-body-generate>pre:last-child code:after, &.markdown-body-generate>td:last-child:after, &.markdown-body-generate>ul:last-child li:last-child:after { color: #65a665; } } .message-reply { .whitespace-pre-wrap { white-space: pre-wrap; color: var(--n-text-color); } } .highlight pre, pre { background-color: #282c34; } } @media screen and (max-width: 533px) { .markdown-body .code-block-wrapper { padding: unset; code { padding: 24px 16px 16px 16px; } } } ================================================ FILE: src/views/chat/components/index.ts ================================================ import Message from './Message/index.vue' export { Message } ================================================ FILE: src/views/chat/hooks/useChat.ts ================================================ import { useChatStore } from '@/store' export function useChat() { const chatStore = useChatStore() const getChatByUuidAndIndex = (uuid: number, index: number) => { return chatStore.getChatByUuidAndIndex(uuid, index) } const addChat = (uuid: number, chat: Chat.Chat) => { chatStore.addChatByUuid(uuid, chat) } const updateChat = (uuid: number, index: number, chat: Chat.Chat) => { chatStore.updateChatByUuid(uuid, index, chat) } const updateChatSome = (uuid: number, index: number, chat: Partial) => { chatStore.updateChatSomeByUuid(uuid, index, chat) } return { addChat, updateChat, updateChatSome, getChatByUuidAndIndex, } } ================================================ FILE: src/views/chat/hooks/useScroll.ts ================================================ import type { Ref } from 'vue' import { nextTick, ref } from 'vue' type ScrollElement = HTMLDivElement | null interface ScrollReturn { scrollRef: Ref scrollToBottom: () => Promise scrollToTop: () => Promise scrollToBottomIfAtBottom: () => Promise } export function useScroll(): ScrollReturn { const scrollRef = ref(null) const scrollToBottom = async () => { await nextTick() if (scrollRef.value) scrollRef.value.scrollTop = scrollRef.value.scrollHeight } const scrollToTop = async () => { await nextTick() if (scrollRef.value) scrollRef.value.scrollTop = 0 } const scrollToBottomIfAtBottom = async () => { await nextTick() if (scrollRef.value) { const threshold = 100 // 阈值,表示滚动条到底部的距离阈值 const distanceToBottom = scrollRef.value.scrollHeight - scrollRef.value.scrollTop - scrollRef.value.clientHeight if (distanceToBottom <= threshold) scrollRef.value.scrollTop = scrollRef.value.scrollHeight } } return { scrollRef, scrollToBottom, scrollToTop, scrollToBottomIfAtBottom, } } ================================================ FILE: src/views/chat/hooks/useUsingContext.ts ================================================ import { computed } from 'vue' import { useMessage } from 'naive-ui' import { t } from '@/locales' import { useChatStore } from '@/store' export function useUsingContext() { const ms = useMessage() const chatStore = useChatStore() const usingContext = computed(() => chatStore.usingContext) function toggleUsingContext() { chatStore.setUsingContext(!usingContext.value) if (usingContext.value) ms.success(t('chat.turnOnContext')) else ms.warning(t('chat.turnOffContext')) } return { usingContext, toggleUsingContext, } } ================================================ FILE: src/views/chat/index.vue ================================================ ================================================ FILE: src/views/chat/layout/Layout.vue ================================================ ================================================ FILE: src/views/chat/layout/Permission.vue ================================================ ================================================ FILE: src/views/chat/layout/index.ts ================================================ import ChatLayout from './Layout.vue' export { ChatLayout } ================================================ FILE: src/views/chat/layout/sider/Footer.vue ================================================ ================================================ FILE: src/views/chat/layout/sider/List.vue ================================================ ================================================ FILE: src/views/chat/layout/sider/index.vue ================================================ ================================================ FILE: src/views/exception/404/index.vue ================================================ ================================================ FILE: src/views/exception/500/index.vue ================================================ ================================================ FILE: src/views/kling/kgImage.vue ================================================ ================================================ FILE: src/views/kling/kgInput.vue ================================================ ================================================ FILE: src/views/kling/kgInputImage.vue ================================================ ================================================ FILE: src/views/kling/kgInputVideo.vue ================================================ ================================================ FILE: src/views/kling/kgList.vue ================================================ ================================================ FILE: src/views/luma/layout.vue ================================================ ================================================ FILE: src/views/luma/lumaInput.vue ================================================ ================================================ FILE: src/views/luma/pikaInput.vue ================================================ ================================================ FILE: src/views/luma/pikaList.vue ================================================ ================================================ FILE: src/views/luma/pixCamera.json ================================================ { "name": { "horizontal_left": "水平向左", "horizontal_right": "水平向右", "vertical_up": "垂直向上", "vertical_down": "垂直向下", "crane_up": "上升镜头", "hitchcock": "希区柯克变焦", "zoom_in": "放大", "zoom_out": "缩小", "quickly_zoom_in": "快速推进", "quickly_zoom_out": "快速拉远", "smooth_zoom_in": "平滑推进", "super_dolly_out": "超级拉远", "left_follow": "左侧跟拍", "right_follow": "右侧跟拍", "pan_left": "左侧环弧", "pan_right": "右侧环弧", "fix_bg": "固定镜头", "camera_rotation": "镜头旋转", "robo_arm": "机械臂运动", "whip_pan": "快速摇镜" }, "image": { "horizontal_left": "https://media.pixverse.ai/asset/template/web_horizontalleft_250429.gif", "horizontal_right": "https://media.pixverse.ai/asset/template/web_horizontalright_250429.gif", "vertical_up": "https://media.pixverse.ai/asset/template/web_verticalup_250429.gif", "vertical_down": "https://media.pixverse.ai/asset/template/web_verticaldown _250429.gif", "crane_up": "https://media.pixverse.ai/asset/template/web_craneup_250428.gif", "hitchcock": "https://media.pixverse.ai/asset/template/Dolly Zoom.gif", "zoom_in": "https://media.pixverse.ai/asset/template/web_zoomin_250429.gif", "zoom_out": "https://media.pixverse.ai/asset/template/web_zoomout_250429.gif", "quickly_zoom_in": "https://media.pixverse.ai/asset/template/web_quicklyzoomin_250428.gif", "quickly_zoom_out": "https://media.pixverse.ai/asset/template/web_quicklyzoomout_250428.gif", "smooth_zoom_in": "https://media.pixverse.ai/asset/template/web_smoothzoomin_250428.gif", "super_dolly_out": "https://media.pixverse.ai/asset/template/web_superdollyout_250428.gif", "left_follow": "https://media.pixverse.ai/asset/template/Left Tracking Shot.gif", "right_follow": "https://media.pixverse.ai/asset/template/Right Tracking Shot.gif", "pan_left": "https://media.pixverse.ai/asset/template/Left Arc Shot.gif", "pan_right": "https://media.pixverse.ai/asset/template/Right Arc Shot.gif", "fix_bg": "https://media.pixverse.ai/asset/template/Fixed Shot.gif", "camera_rotation": "https://media.pixverse.ai/asset/template/web_camerarotation_250428.gif", "robo_arm": "https://media.pixverse.ai/asset/template/web_roboarm_250428.gif", "whip_pan": "https://media.pixverse.ai/asset/template/web_whippan_250428.gif" } } ================================================ FILE: src/views/luma/pixEffact.json ================================================ [ { "display_name": "Muscle Surge", "workflow_tag": "muscle_241128", "template_id": 308621408717184, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fwithbaby.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-11-28T17:53:21Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Show off your strong muscles and have everyone hooked.", "i18n_json": "{\"zh-CN\":{\"display_name\":\"成为肌肉猛男\",\"display_prompt\":\"体验猛男快乐\"}}", "example_list": "[{\"img_id\":113750602,\"img_url\":\"https://media.pixverse.ai/upload%2F920dc791-8c9f-4518-8761-82958a827190.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Hug Your Love", "workflow_tag": "hug_love_241030", "template_id": 303624424723200, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fhug2.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-10-31T12:07:47Z", "updated_at": "2025-01-06T05:32:42Z", "display_prompt": "Hug each other\t", "i18n_json": "{\"zh-CN\":{\"display_name\":\"爱的抱抱\",\"display_prompt\":\"互相拥抱在一起\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Alive Art", "workflow_tag": "alive_art_241028", "template_id": 302325299721280, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Faliveart.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2025-01-06T05:32:53Z", "display_prompt": "The [OBJECT] comes to life and walks out of the [SCENE]", "i18n_json": "{\"zh-CN\":{\"display_name\":\"活灵活现\",\"display_prompt\":\"它活了!\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Sheep Curls", "workflow_tag": "sheep_241208", "template_id": 310371322329472, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FSheepCurls.gif", "thumbnail_video_path": "", "marker": "new", "created_at": "2024-12-08T15:14:11Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Change hairstyle for a better mood", "i18n_json": "{\"zh-CN\":{\"display_name\":\"万物皆可羊毛卷\",\"display_prompt\":\"心情不好,换个发型看看\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Sailor Moon", "workflow_tag": "meishaonv_241225", "template_id": 313359138372032, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fmeishaonv2.gif", "thumbnail_video_path": "", "marker": "", "created_at": "2024-12-25T12:29:05Z", "updated_at": "2025-01-06T05:32:33Z", "display_prompt": "Moon Prism Power, Make Up!", "i18n_json": "{\"zh-CN\":{\"display_name\":\"成为美少女战士\",\"display_prompt\":\"月之水晶力量,变身!\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Black Myth: Wukong", "workflow_tag": "heiwukong_241225", "template_id": 313359209531840, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fmonkey.gif", "thumbnail_video_path": "", "marker": "", "created_at": "2024-12-25T12:29:40Z", "updated_at": "2025-01-06T05:32:25Z", "display_prompt": "I am Sun Wukong, the Victorious Fighting Buddha!", "i18n_json": "{\"zh-CN\":{\"display_name\":\"黑悟空引擎\",\"display_prompt\":\"放马西行,直面天命!\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Santa's Secret Gifts", "workflow_tag": "santa_gift_241213", "template_id": 311521768592256, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fgift111.gif", "thumbnail_video_path": "", "marker": "new", "created_at": "2024-12-15T03:16:32Z", "updated_at": "2024-12-30T06:08:16Z", "display_prompt": "I want a:", "i18n_json": "{\"zh-CN\":{\"display_name\":\"圣诞礼物盲盒\",\"display_prompt\":\"我想要:\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Where is Santa?", "workflow_tag": "where_is_santa_241213", "template_id": 311521879229312, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fwheresanta.gif", "thumbnail_video_path": "", "marker": "new", "created_at": "2024-12-15T03:17:26Z", "updated_at": "2024-12-30T06:08:24Z", "display_prompt": "Discovering Santa Claus in the parallel world!", "i18n_json": "{\"zh-CN\":{\"display_name\":\"圣诞老人藏在哪?\",\"display_prompt\":\"“发现”世界各处的圣诞老人\"}}", "example_list": "[{\"img_id\":119280295,\"img_url\":\"https://media.pixverse.ai/upload%2Fde34a072-325e-4d86-88d9-2daef292e1b4.jpeg\"},{\"img_id\":119280616,\"img_url\":\"https://media.pixverse.ai/upload%2F5b4da0a2-86c3-4204-adda-74bfa7c3d0d1.jpg\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Christmas OOTD", "workflow_tag": "tobe_santa_241219", "template_id": 312314911869312, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fbesanta33.gif", "thumbnail_video_path": "", "marker": "new", "created_at": "2024-12-19T14:51:09Z", "updated_at": "2024-12-30T06:08:08Z", "display_prompt": "Dress up as a Christmas star", "i18n_json": "{\"zh-CN\":{\"display_name\":\"圣诞战袍\",\"display_prompt\":\"测测什么圣诞装适合你\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "We Are Venom!", "workflow_tag": "venom_241030", "template_id": 303624537709312, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FWeAreVenom.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-10-31T12:08:42Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Transform into a [BLACK] Venom", "i18n_json": "{\"zh-CN\":{\"display_name\":\"毒液变身!\",\"display_prompt\":\"变身成为【黑色】毒液\"}}", "example_list": "[{\"img_id\":113750602,\"img_url\":\"https://media.pixverse.ai/upload%2F920dc791-8c9f-4518-8761-82958a827190.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Hot Harley Quinn", "workflow_tag": "harley_quinn_241121", "template_id": 307489434436288, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FHotHarleyQuinn.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-22T08:21:19Z", "updated_at": "2024-12-26T07:40:43Z", "display_prompt": "Transform into Harley Quinn, mastering allure and chaos", "i18n_json": "{\"zh-CN\":{\"display_name\":\"小丑女哈莉·奎茵变身\",\"display_prompt\":\"化身小丑女哈莉·奎茵,掌控魅惑与疯狂\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113742000,\"img_url\":\"https://media.pixverse.ai/upload%2F19090035-612e-40ed-9c8d-a7aaf781d492.png\"},{\"img_id\":113742074,\"img_url\":\"https://media.pixverse.ai/upload%2F50ed9020-7b58-4dd9-aa39-ff06b9e0df12.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Crazy Cat Woman", "workflow_tag": "cat_woman_241121", "template_id": 307489548427968, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FCrazyCatWoman.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-22T08:22:15Z", "updated_at": "2024-12-26T07:40:24Z", "display_prompt": "Transform into a Crazy Cat Woman and slay", "i18n_json": "{\"zh-CN\":{\"display_name\":\"疯狂猫女变身\",\"display_prompt\":\"变身妖娆猫女,撩翻全场!\"}}", "example_list": "[{\"img_id\":113742074,\"img_url\":\"https://media.pixverse.ai/upload%2F50ed9020-7b58-4dd9-aa39-ff06b9e0df12.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Wonder Woman", "workflow_tag": "wonder_woman_241202", "template_id": 309283958194560, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FWonderWoman.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-12-02T11:45:11Z", "updated_at": "2024-12-26T07:40:35Z", "display_prompt": "Transform into Wonder Woman and conquer the impossible", "i18n_json": "{\"zh-CN\":{\"display_name\":\"神奇女侠变身\",\"display_prompt\":\"成为神奇女侠,征服一切不可能\"}}", "example_list": "[{\"img_id\":113742074,\"img_url\":\"https://media.pixverse.ai/upload%2F50ed9020-7b58-4dd9-aa39-ff06b9e0df12.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Hulk", "workflow_tag": "hulk_241106", "template_id": 304826314164992, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2FHulk.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-07T07:08:47Z", "updated_at": "2024-12-26T07:38:48Z", "display_prompt": "Unleash the Beast", "i18n_json": "{\"zh-CN\":{\"display_name\":\"召唤绿巨人\",\"display_prompt\":\"变身成绿巨人并捶爆一切\"}}", "example_list": "[{\"img_id\":113750602,\"img_url\":\"https://media.pixverse.ai/upload%2F920dc791-8c9f-4518-8761-82958a827190.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Joker's Rebirth", "workflow_tag": "joker_241106", "template_id": 304826126435072, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_joker.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-07T07:07:16Z", "updated_at": "2024-12-26T07:38:54Z", "display_prompt": "Transform into a Joker", "i18n_json": "{\"zh-CN\":{\"display_name\":\"小丑重生\",\"display_prompt\":\"变身成小丑,诡异地微笑\"}}", "example_list": "[{\"img_id\":113750602,\"img_url\":\"https://media.pixverse.ai/upload%2F920dc791-8c9f-4518-8761-82958a827190.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Batman", "workflow_tag": "bat_man_241106", "template_id": 304826374632192, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_batman.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-07T07:09:17Z", "updated_at": "2024-12-26T07:39:00Z", "display_prompt": "Transform into a Batman and embrace the night", "i18n_json": "{\"zh-CN\":{\"display_name\":\"蝙蝠侠归来\",\"display_prompt\":\"变身成蝙蝠侠并守护黑夜\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Iron Man", "workflow_tag": "iron_man_241106", "template_id": 304826054394624, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_ironman.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-07T07:06:40Z", "updated_at": "2024-12-26T07:39:06Z", "display_prompt": "Activate Iron Mode", "i18n_json": "{\"zh-CN\":{\"display_name\":\"钢铁侠变身\",\"display_prompt\":\"激活钢铁模式\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Hair Growth Magic", "workflow_tag": "hair_magic_241128", "template_id": 308552687706496, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_hairgrowth.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-28T08:34:06Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Grow lots of hair. Never be bald.", "i18n_json": "{\"zh-CN\":{\"display_name\":\"发量王者\",\"display_prompt\":\"长出迷人秀发,永无秃头困扰。\"}}", "example_list": "[{\"img_id\":113750602,\"img_url\":\"https://media.pixverse.ai/upload%2F920dc791-8c9f-4518-8761-82958a827190.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"},{\"img_id\":113750791,\"img_url\":\"https://media.pixverse.ai/upload%2Ff2853009-8238-4e0f-93ec-cfc68fee28b7.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "COLORFUL Venom!", "workflow_tag": "random_venom_241104", "template_id": 304358279051648, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_colorfulvenom.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-04T15:39:54Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Transform into a [COLORFUL] Venom", "i18n_json": "{\"zh-CN\":{\"display_name\":\"毒液!(彩色盲盒版)\",\"display_prompt\":\"变身成为【彩色】毒液\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Who is Venom?", "workflow_tag": "who_is_venom_241112", "template_id": 305714097668480, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_whoisvenom.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-12T07:33:35Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Which one of you guys is Venom? ", "i18n_json": "{\"zh-CN\":{\"display_name\":\"测测谁是毒液?\",\"display_prompt\":\"两人之中,必有一毒,速速现出原形\"}}", "example_list": "[{\"img_id\":111917190,\"img_url\":\"https://media.pixverse.ai/upload%2F6a6a0f6a-99be-4eac-83a1-9d265ca65823.png\"},{\"img_id\":111917753,\"img_url\":\"https://media.pixverse.ai/upload%2F079945d6-01aa-4688-9e9a-02e308c01db5.png\"},{\"img_id\":111917942,\"img_url\":\"https://media.pixverse.ai/upload%2F814307ed-4123-4f6b-a32e-4072b55378cb.png\"}]", "qualities": [ "360p", "540p" ] }, { "display_name": "Get a Venom buddy", "workflow_tag": "baby_venom_241114", "template_id": 306059795500352, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_venombuddy.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-14T06:26:53Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "Your Venom buddy appears and gives you a hug", "i18n_json": "{\"zh-CN\":{\"display_name\":\"召唤毒液兄弟\",\"display_prompt\":\"你的毒液兄弟回到你身边,并与你深情相拥\"}}", "example_list": "[{\"img_id\":113741803,\"img_url\":\"https://media.pixverse.ai/upload%2Fb2626bc2-050d-4ea6-a864-e2054c012df5.png\"},{\"img_id\":113750690,\"img_url\":\"https://media.pixverse.ai/upload%2Fddd29e75-beeb-461c-9388-3e14c2709e73.png\"}]", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Wicked Shots", "workflow_tag": "wicked_paintings_241028", "template_id": 303788802773760, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_wickedshot.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-11-01T10:25:30Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "The [SUBJECT] in the picture smiles wickedly and starts firing", "i18n_json": "{\"zh-CN\":{\"display_name\":\"扫射一切\",\"display_prompt\":\"邪魅一笑,并掏出一把机关枪开始扫射\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Squish It", "workflow_tag": "squish_it_241028", "template_id": 302325299692608, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_squishit.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "A pair of hands appears and squishes the [OBJECT] as if it's slime", "i18n_json": "{\"zh-CN\":{\"display_name\":\"捏捏更解压\",\"display_prompt\":\"变成可以捏捏的软泥\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Lego Blast", "workflow_tag": "lego_blast_241028", "template_id": 302325299702848, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_legoblast.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "The [OBJECT] shatters into pieces of Legos", "i18n_json": "{\"zh-CN\":{\"display_name\":\"乐高大爆炸\",\"display_prompt\":\"爆炸并碎裂成一片片乐高积木\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Leggy Run", "workflow_tag": "leggy_run_241028", "template_id": 302325299711040, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_leggyrun.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "The [OBJECT] grows legs and runs away", "i18n_json": "{\"zh-CN\":{\"display_name\":\"全员腿精\",\"display_prompt\":\"长出了一双腿然后开始乱跑\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Monster Invades", "workflow_tag": "monster_invasion_241028", "template_id": 302325299682368, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_monster.gif", "thumbnail_video_path": "", "marker": "default", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "A monster suddenly appears in the [SCENE] and starts walking around", "i18n_json": "{\"zh-CN\":{\"display_name\":\"怪兽入侵\",\"display_prompt\":\"场景中突然出现了一只怪兽\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Wizard Hat", "workflow_tag": "animal_wizard_241028", "template_id": 302325299661888, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_wizardhat.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "The [SUBJECT] wears a magic wizard hat", "i18n_json": "{\"zh-CN\":{\"display_name\":\"戴上魔法帽\",\"display_prompt\":\"头顶出现了一顶可爱的魔法帽\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Zombie Hand", "workflow_tag": "zombie_hand_241028", "template_id": 302325299672128, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_weirdhand.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "A zombie hand appears in the [SCENE]", "i18n_json": "{\"zh-CN\":{\"display_name\":\"僵尸手出没\",\"display_prompt\":\"从图片中的场景中钻出一只僵尸的手\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] }, { "display_name": "Zombie Mode", "workflow_tag": "zombie_mode_241028", "template_id": 302325299651648, "thumbnail_path": "https://media.pixverse.ai/asset%2Ftemplate%2Fcapcut_zombiemode.gif", "thumbnail_video_path": "", "marker": "hot", "created_at": "2024-10-24T03:55:29Z", "updated_at": "2024-12-25T10:19:28Z", "display_prompt": "The [SUBJECT] suddenly transforms into a zombie.", "i18n_json": "{\"zh-CN\":{\"display_name\":\"坏了,我变僵尸了\",\"display_prompt\":\"突然变成僵尸\"}}", "example_list": "", "qualities": [ "360p", "540p", "720p", "1080p" ] } ] ================================================ FILE: src/views/luma/pixInput.vue ================================================ ================================================ FILE: src/views/luma/pixList.vue ================================================ ================================================ FILE: src/views/luma/runInput.vue ================================================ ================================================ FILE: src/views/luma/runmlInput.vue ================================================ ================================================ FILE: src/views/luma/runmlList.vue ================================================ ================================================ FILE: src/views/luma/runwayInput.vue ================================================ ================================================ FILE: src/views/luma/runwayList.vue ================================================ ================================================ FILE: src/views/luma/video.vue ================================================ ================================================ FILE: src/views/luma/voInput.vue ================================================ ================================================ FILE: src/views/luma/voList.vue ================================================ ================================================ FILE: src/views/mj/aiBlend.vue ================================================ ================================================ FILE: src/views/mj/aiCanvas.vue ================================================ ================================================ FILE: src/views/mj/aiDall.vue ================================================ ================================================ FILE: src/views/mj/aiDrawInput.vue ================================================ ================================================ FILE: src/views/mj/aiDrawInputItem.vue ================================================ ================================================ FILE: src/views/mj/aiEditImage.vue ================================================ ================================================ FILE: src/views/mj/aiEditVidoe.vue ================================================ ================================================ FILE: src/views/mj/aiFace.vue ================================================ ================================================ FILE: src/views/mj/aiFooter.vue ================================================ ================================================ FILE: src/views/mj/aiGallery.vue ================================================ ================================================ FILE: src/views/mj/aiGalleryItem.vue ================================================ ================================================ FILE: src/views/mj/aiGpt.vue ================================================ ================================================ FILE: src/views/mj/aiGptInput.vue ================================================ ================================================ FILE: src/views/mj/aiGpts.vue ================================================ ================================================ FILE: src/views/mj/aiGptsAdd.vue ================================================ ================================================ FILE: src/views/mj/aiGptsCom.vue ================================================ ================================================ FILE: src/views/mj/aiIdeoInput.vue ================================================ ================================================ FILE: src/views/mj/aiListText.vue ================================================ ================================================ FILE: src/views/mj/aiMic.vue ================================================ ================================================ FILE: src/views/mj/aiMobileMenu.vue ================================================ ================================================ FILE: src/views/mj/aiModel.vue ================================================ ================================================ FILE: src/views/mj/aiModelServer.vue ================================================ ================================================ FILE: src/views/mj/aiMsg.vue ================================================ ================================================ FILE: src/views/mj/aiOther.vue ================================================ ================================================ FILE: src/views/mj/aiSetAuth.vue ================================================ ================================================ FILE: src/views/mj/aiSetServer.vue ================================================ ================================================ FILE: src/views/mj/aiSider.vue ================================================ ================================================ FILE: src/views/mj/aiSiderInput.vue ================================================ ================================================ FILE: src/views/mj/aiTextSetting.vue ================================================ ================================================ FILE: src/views/mj/dallText.vue ================================================ ================================================ FILE: src/views/mj/draw.json ================================================ { "qualityList": [ { "labelKey": "draw.qualityList.general", "value": "0.25" }, { "labelKey": "draw.qualityList.clear", "value": "0.5" }, { "labelKey": "draw.qualityList.hd", "value": "1" }, { "labelKey": "draw.qualityList.ultraHd", "value": "2" } ], "styleList": [ { "labelKey": "draw.styleList.cyberpunk", "value": "Cyberpunk" }, { "labelKey": "draw.styleList.star", "value": "Warframe" }, { "labelKey": "draw.styleList.anime", "value": "ACGN" }, { "labelKey": "draw.styleList.japaneseComicsManga", "value": "Japanese comics/manga" }, { "labelKey": "draw.styleList.inkWashPaintingStyle", "value": "Ink Wash Painting Style" }, { "labelKey": "draw.styleList.original", "value": "Original" }, { "labelKey": "draw.styleList.landscape", "value": "landscape" }, { "labelKey": "draw.styleList.illustration", "value": "illustration" }, { "labelKey": "draw.styleList.manga", "value": "Manga" }, { "labelKey": "draw.styleList.modernOrganic", "value": "modern organic" }, { "labelKey": "draw.styleList.genesis", "value": "Genesis" }, { "labelKey": "draw.styleList.posterstyle", "value": "posterstyle" }, { "labelKey": "draw.styleList.surrealism", "value": "surrealism" }, { "labelKey": "draw.styleList.sketch", "value": "sketch" }, { "labelKey": "draw.styleList.realism", "value": "realism" }, { "labelKey": "draw.styleList.watercolorPainting", "value": "Watercolor painting" }, { "labelKey": "draw.styleList.cubism", "value": "Cubism" }, { "labelKey": "draw.styleList.blackAndWhite", "value": "black and white" }, { "labelKey": "draw.styleList.fmPhotography", "value": "fm photography" }, { "labelKey": "draw.styleList.cinematic", "value": "cinematic" }, { "labelKey": "draw.styleList.clearFacialFeatures", "value": "dlear facial features" } ], "viewList": [ { "labelKey": "draw.viewList.wideView", "value": "Wide view" }, { "labelKey": "draw.viewList.birdView", "value": "Aerial view" }, { "labelKey": "draw.viewList.topView", "value": "Top view" }, { "labelKey": "draw.viewList.upview", "value": "Upview" }, { "labelKey": "draw.viewList.frontView", "value": "Front view" }, { "labelKey": "draw.viewList.headshot", "value": "Headshot" }, { "labelKey": "draw.viewList.ultrawideshot", "value": "Ultrawideshot" }, { "labelKey": "draw.viewList.mediumShot", "value": "Medium Shot(MS)" }, { "labelKey": "draw.viewList.longShot", "value": "Long Shot(LS)" }, { "labelKey": "draw.viewList.depthOfField", "value": "depth offield(dof)" } ], "shotList": [ { "labelKey": "draw.shotList.faceShot", "value": "Face Shot (VCU)" }, { "labelKey": "draw.shotList.bigCloseUp", "value": "Big Close-Up(BCU)" }, { "labelKey": "draw.shotList.closeUp", "value": "Close-Up(CU)" }, { "labelKey": "draw.shotList.waistShot", "value": "Waist Shot(WS)" }, { "labelKey": "draw.shotList.kneeShot", "value": "KneeShot(KS)" }, { "labelKey": "draw.shotList.fullLengthShot", "value": "Full Length Shot(FLS)" }, { "labelKey": "draw.shotList.extraLongShot", "value": "Extra Long Shot(ELS)" } ], "stylesList": [ { "labelKey": "draw.stylesList.styleLow", "value": "--s 50" }, { "labelKey": "draw.stylesList.styleMed", "value": "--s 100" }, { "labelKey": "draw.stylesList.styleHigh", "value": "--s 250" }, { "labelKey": "draw.stylesList.styleVeryHigh", "value": "--s 750" } ], "lightList": [ { "labelKey": "draw.lightList.coldLight", "value": "Cold light" }, { "labelKey": "draw.lightList.warmLight", "value": "Warm light" }, { "labelKey": "draw.lightList.hardLighting", "value": "hard lighting" }, { "labelKey": "draw.lightList.dramaticLight", "value": "Dramatic light" }, { "labelKey": "draw.lightList.reflectionLight", "value": "reflection light" }, { "labelKey": "draw.lightList.mistyFoggy", "value": "Misty foggy" }, { "labelKey": "draw.lightList.naturalLight", "value": "Natural light" }, { "labelKey": "draw.lightList.sunLight", "value": "Sun light" }, { "labelKey": "draw.lightList.moody", "value": "moody" } ], "versionList": [ { "labelKey": "MJ V7", "value": "--v 7.0" }, { "labelKey": "draw.versionList.mjV61", "value": "--v 6.1" }, { "labelKey": "draw.versionList.mjV6", "value": "--v 6.0" }, { "labelKey": "draw.versionList.mjV52", "value": "--v 5.2" }, { "labelKey": "draw.versionList.mjV51", "value": "--v 5.1" }, { "labelKey": "Niji V7", "value": "--niji 7" }, { "labelKey": "draw.versionList.nijiV6", "value": "--niji 6" }, { "labelKey": "draw.versionList.nijiV5", "value": "--niji 5" }, { "labelKey": "draw.versionList.nijiV4", "value": "--niji 4" }, { "labelKey": "draw.versionList.nijiJourney", "value": "NIJI_JOURNEY" } ], "botList": [ { "labelKey": "draw.botList.midjourneyBot", "value": "MID_JOURNEY" }, { "labelKey": "draw.botList.nijiJourney", "value": "NIJI_JOURNEY" } ], "dimensionsList": [ { "labelKey": "draw.dimensionsList.square", "value": "SQUARE" }, { "labelKey": "draw.dimensionsList.portrait", "value": "PORTRAIT" }, { "labelKey": "draw.dimensionsList.landscape", "value": "LANDSCAPE" } ] } ================================================ FILE: src/views/mj/draw.vue ================================================ ================================================ FILE: src/views/mj/drawList.vue ================================================ ================================================ FILE: src/views/mj/index.ts ================================================ import aiSider from "./aiSider.vue" import aiGpts from "./aiGpts.vue" import aiGallery from "./aiGallery.vue" import aiFooter from "./aiFooter.vue" export {aiSider,aiGpts,aiGallery,aiFooter } ================================================ FILE: src/views/mj/layout.vue ================================================ ================================================ FILE: src/views/mj/mjText.vue ================================================ ================================================ FILE: src/views/mj/mjTextAttr.vue ================================================ ================================================ FILE: src/views/mj/myTest.vue ================================================ ================================================ FILE: src/views/mj/ttsText.vue ================================================ ================================================ FILE: src/views/mj/whisperText.vue ================================================ ================================================ FILE: src/views/suno/layout.vue ================================================ ================================================ FILE: src/views/suno/mcInput.vue ================================================ ================================================ FILE: src/views/suno/mcList.vue ================================================ ================================================ FILE: src/views/suno/mcUploadMp3.vue ================================================ ================================================ FILE: src/views/suno/mcplayer.vue ================================================ ================================================ FILE: src/views/suno/music.vue ================================================ ================================================ FILE: src/views/suno/player.vue ================================================ ================================================ FILE: src/views/suno/playui.vue ================================================ ================================================ FILE: src/views/suno/riffInput.vue ================================================ ================================================ FILE: src/views/suno/riffList.vue ================================================ ================================================ FILE: src/views/suno/udioInput.vue ================================================ ================================================ FILE: src/views/suno/udioList.vue ================================================ ================================================ FILE: src/views/video/image-base64-array.vue ================================================ ================================================ FILE: src/views/video/input.vue ================================================ ================================================ FILE: src/views/video/list.vue ================================================ ================================================ FILE: src/views/video/tpl.json ================================================ { "tpl":[ { "model":"veo3-fast-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"google-veo" }, { "model":"veo2-fast-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"google-veo" }, { "model":"veo2-fast-components", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":3 } ] ,"plat":"google-veo" } , { "model":"veo3-fast", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3-pro", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3-pro-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":1 } ] ,"plat":"google-veo" },{ "model":"fal-ai/ltxv-13b-098-distilled/image-to-video", "plat":"fal-ai", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"The astronaut gets up and walks away" },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 480p", "value":"480p"} ,{ "label":"Resolution 720p", "value":"720p"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg" } ] },{ "model":"fal-ai/ltxv-13b-098-distilled", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A cinematic fast-tracking shot follows a vintage, teal camper van as it descends a winding mountain trail. The van, slightly weathered but well-maintained, is the central focus, its retro design emphasized by the motion blur. Medium shot reveals the dusty, ochre trail, edged with vibrant green pine trees. Close-up on the van's tires shows the gravel spraying, highlighting the speed and rugged terrain. Sunlight filters through the trees, casting dappled shadows on the van and the trail. The background is a hazy, majestic mountain range bathed in warm, golden light. The overall mood is adventurous and exhilarating. High resolution 4k movie scene." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 480p", "value":"480p"} ,{ "label":"Resolution 720p", "value":"720p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"1:1", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/master/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A cinematic fast-tracking shot follows a vintage, teal camper van as it descends a winding mountain trail. The van, slightly weathered but well-maintained, is the central focus, its retro design emphasized by the motion blur. Medium shot reveals the dusty, ochre trail, edged with vibrant green pine trees. Close-up on the van's tires shows the gravel spraying, highlighting the speed and rugged terrain. Sunlight filters through the trees, casting dappled shadows on the van and the trail. The background is a hazy, majestic mountain range bathed in warm, golden light. The overall mood is adventurous and exhilarating. High resolution 4k movie scene." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"aspect_ratio", "type":"select", "value":"1:1", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/standard/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Warm, incandescent streetlights paint the rain-slicked cobblestones in pools of amber light as a couple walks hand-in-hand, their silhouettes stark against the blurry backdrop of a city shrouded in a gentle downpour; the camera lingers on the subtle textures of their rain-soaked coats and the glistening reflections dancing on the wet pavement, creating a sense of intimate vulnerability and shared quietude." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/lion/_I_io6Gtk83c72d-afXf8_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/pro/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Warm, incandescent streetlights paint the rain-slicked cobblestones in pools of amber light as a couple walks hand-in-hand, their silhouettes stark against the blurry backdrop of a city shrouded in a gentle downpour; the camera lingers on the subtle textures of their rain-soaked coats and the glistening reflections dancing on the wet pavement, creating a sense of intimate vulnerability and shared quietude." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/lion/_I_io6Gtk83c72d-afXf8_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/master/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Sunlight dapples through budding branches, illuminating a vibrant tapestry of greens and browns as a pair of robins meticulously weave twigs and mud into a cradle of life, their tiny forms a whirlwind of activity against a backdrop of blossoming spring. The scene unfolds with a gentle, observational pace, allowing the viewer to fully appreciate the intricate details of nest construction, the soft textures of downy feathers contrasted against the rough bark of the branches, the delicate balance of strength and fragility in their creation." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/zebra/9Nrm22YyLojSTPJbZYNhh_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/standard/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A Galactic Smuggler is a rogue figure with a cybernetic arm and a well-worn coat that hints at many dangerous escapades across the galaxy. Their ship is filled with rare and exotic treasures from distant planets, concealed in hidden compartments, showing their expertise in illicit trade. Their belt is adorned with energy-based weapons, ready to be drawn at any moment to protect themselves or escape from tight situations. This character thrives in the shadows of space, navigating between the law and chaos with stealth and wit, always seeking the next big score while evading bounty hunters and law enforcement. The rogue's ship, rugged yet efficient, serves as both a home and a tool for their dangerous lifestyle. The treasures they collect reflect the diverse and intriguing worlds they've encountered—alien artifacts, rare minerals, and artifacts of unknown origin. Their reputation precedes them, with whispers of their dealings and the deadly encounters that often follow. A master of negotiation and deception, the Galactic Smuggler navigates the cosmos with an eye on the horizon, always one step ahead of those who pursue them." } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/pro/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A Galactic Smuggler is a rogue figure with a cybernetic arm and a well-worn coat that hints at many dangerous escapades across the galaxy. Their ship is filled with rare and exotic treasures from distant planets, concealed in hidden compartments, showing their expertise in illicit trade. Their belt is adorned with energy-based weapons, ready to be drawn at any moment to protect themselves or escape from tight situations. This character thrives in the shadows of space, navigating between the law and chaos with stealth and wit, always seeking the next big score while evading bounty hunters and law enforcement. The rogue's ship, rugged yet efficient, serves as both a home and a tool for their dangerous lifestyle. The treasures they collect reflect the diverse and intriguing worlds they've encountered—alien artifacts, rare minerals, and artifacts of unknown origin. Their reputation precedes them, with whispers of their dealings and the deadly encounters that often follow. A master of negotiation and deception, the Galactic Smuggler navigates the cosmos with an eye on the horizon, always one step ahead of those who pursue them." } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02-fast/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Extremely realistic movement An old samurai is breaking a stone in half" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/tiger/U9HN_tm5-3Ls52SbD6CrW_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/pro/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Man walked into winter cave with polar bear" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"resolution", "type":"select", "value":"768P", "options":[ { "label":"Resolution 512P", "value":"512P"} ,{ "label":"Resolution 768P", "value":"768P"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/model_tests/minimax/1749891352437225630-389852416840474630_1749891352.png" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/standard/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Man walked into winter cave with polar bear" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"resolution", "type":"select", "value":"768P", "options":[ { "label":"Resolution 512P", "value":"512P"} ,{ "label":"Resolution 768P", "value":"768P"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/model_tests/minimax/1749891352437225630-389852416840474630_1749891352.png" } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2.1/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A young woman in a pale blue corset and denim, her vibrant blue bob framed against a dusky desert landscape, walks slowly, her gaze unwavering and enigmatic as the camera remains fixed on her deliberate pace. The warm glow of a stucco house contrasts with the cool desert air, hinting at both refuge and isolation, while a blurred figure retreating inside adds a layer of unspoken narrative to her solitary journey." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2.2/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Sunlight streams down on a woman with flowing auburn hair as she runs effortlessly along a tree-lined street, her joyous expression reflecting the freedom of the moment; the simple, steady camerawork emphasizes her grace and the beauty of the everyday." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2/turbo/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A young woman in a pale blue corset and denim, her vibrant blue bob framed against a dusky desert landscape, walks slowly, her gaze unwavering and enigmatic as the camera remains fixed on her deliberate pace. The warm glow of a stucco house contrasts with the cool desert air, hinting at both refuge and isolation, while a blurred figure retreating inside adds a layer of unspoken narrative to her solitary journey." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2.1/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A pink heart exploding." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/elephant/dJjBQXNHRbGJn4aUv4-g9_hearth.jpg" } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2.2/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"a woman looking into camera slowly smiling" } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/web-examples/pika/pika%202.2/pika_input.png" } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2/turbo/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A pink heart exploding." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/elephant/dJjBQXNHRbGJn4aUv4-g9_hearth.jpg" } ], "plat":"fal-ai" } ] } ================================================ FILE: src/views/video/tpl.ts ================================================ export const mytpl={ "tpl":[ { "model":"sora-2", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"在北京繁忙的人行道上进行的一个随意街头采访。采访者手持一个普通、没有品牌标志的麦克风并问道:你知道OpenAI的Sora 2新模型吗?这是一个好用的视频模型。受访者回答说:是的,我有所了解,它已经可以在openai-hk平台上使用,太好用了。" } ,{ "key":"orientation", "type":"select", "value":"portrait", "options":[ { "label":"模式: 竖屏", "value":"portrait"} ,{ "label":"模式: 横屏", "value":"landscape"} ] } ,{ "key":"duration", "type":"select", "value":15, "options":[ { "label":"Duration: 15s", "value":15} ,{ "label":"Duration: 10s", "value":10} ] } , { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"sora" }, { "model":"sora-2-pro", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"在北京繁忙的人行道上进行的一个随意街头采访。采访者手持一个普通、没有品牌标志的麦克风并问道:你知道OpenAI的Sora 2新模型吗?这是一个好用的视频模型。受访者回答说:是的,我有所了解,它已经可以在openai-hk平台上使用,太好用了。" } ,{ "key":"orientation", "type":"select", "value":"portrait", "options":[ { "label":"模式: 竖屏", "value":"portrait"} ,{ "label":"模式: 横屏", "value":"landscape"} ] } ,{ "key":"size", "type":"select", "value":"large", "options":[ { "label":"清晰: 高清", "value":"large"} ,{ "label":"清晰: 一般", "value":"small"} ] } ,{ "key":"duration", "type":"select", "value":15, "options":[ { "label":"Duration: 25s", "value":25} ,{ "label":"Duration: 15s", "value":15} ,{ "label":"Duration: 10s", "value":10} ] } , { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"sora" }, { "model":"openai/sora-2", "key":"sora-2", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"在北京繁忙的人行道上进行的一个随意街头采访。采访者手持一个普通、没有品牌标志的麦克风并问道:你知道OpenAI的Sora 2新模型吗?这是一个好用的视频模型。受访者回答说:是的,我有所了解,它已经可以在openai-hk平台上使用,太好用了。" } ,{ "key":"size", "type":"select", "value":"720x1280", "options":[ { "label":"size: 720x1280", "value":"720x1280"} ,{ "label":"size: 1280x720", "value":"1280x720"} ] } ,{ "key":"seconds", "type":"select", "value":4, "options":[ { "label":"Duration: 15s", "value":15} ,{ "label":"Duration: 10s", "value":10} ,{ "label":"Duration: 8s", "value":8} ,{ "label":"Duration: 4s", "value":4} ] } , { "key":"input_reference", "type":"image_base64_file", "max":1 } ] ,"plat":"openai" }, { "model":"openai/sora-2-pro", "key":"sora-2-pro", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"在北京繁忙的人行道上进行的一个随意街头采访。采访者手持一个普通、没有品牌标志的麦克风并问道:你知道OpenAI的Sora 2新模型吗?这是一个好用的视频模型。受访者回答说:是的,我有所了解,它已经可以在openai-hk平台上使用,太好用了。" } ,{ "key":"size", "type":"select", "value":"720x1280", "options":[ { "label":"size: 720x1280", "value":"720x1280"} ,{ "label":"size: 1280x720", "value":"1280x720"} ] } ,{ "key":"seconds", "type":"select", "value":4, "options":[ { "label":"Duration: 25s", "value":25} ,{ "label":"Duration: 15s", "value":15} ,{ "label":"Duration: 10s", "value":10} ,{ "label":"Duration: 8s", "value":8} ,{ "label":"Duration: 4s", "value":4} ] } , { "key":"input_reference", "type":"image_base64_file", "max":1 } ] ,"plat":"openai" }, { "model":"veo3.1", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] }, { "key":"images", "type":"image_base64_url_array", "max":1 } ] ,"plat":"google-veo" } , { "model":"veo3.1-pro", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] }, { "key":"images", "type":"image_base64_url_array", "max":1 } ] ,"plat":"google-veo" } , { "model":"veo3.1-components", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":3 } ] ,"plat":"google-veo" } , { "model":"veo3-fast-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"google-veo" }, { "model":"veo2-fast-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":2 } ] ,"plat":"google-veo" }, { "model":"veo2-fast-components", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":3 } ] ,"plat":"google-veo" } , { "model":"veo3-fast", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3-pro", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true } ,{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ] } ] ,"plat":"google-veo" } , { "model":"veo3-pro-frames", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description" } ,{ "key":"enhance_prompt", "type":"no", "value":true }, { "key":"images", "type":"image_base64_url_array", "max":1 } ] ,"plat":"google-veo" },{ "model":"fal-ai/ltxv-13b-098-distilled/image-to-video", "plat":"fal-ai", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"The astronaut gets up and walks away" },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 480p", "value":"480p"} ,{ "label":"Resolution 720p", "value":"720p"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/example_inputs/ltxv-image-input.jpg" } ] },{ "model":"fal-ai/ltxv-13b-098-distilled", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A cinematic fast-tracking shot follows a vintage, teal camper van as it descends a winding mountain trail. The van, slightly weathered but well-maintained, is the central focus, its retro design emphasized by the motion blur. Medium shot reveals the dusty, ochre trail, edged with vibrant green pine trees. Close-up on the van's tires shows the gravel spraying, highlighting the speed and rugged terrain. Sunlight filters through the trees, casting dappled shadows on the van and the trail. The background is a hazy, majestic mountain range bathed in warm, golden light. The overall mood is adventurous and exhilarating. High resolution 4k movie scene." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 480p", "value":"480p"} ,{ "label":"Resolution 720p", "value":"720p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"1:1", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/master/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A cinematic fast-tracking shot follows a vintage, teal camper van as it descends a winding mountain trail. The van, slightly weathered but well-maintained, is the central focus, its retro design emphasized by the motion blur. Medium shot reveals the dusty, ochre trail, edged with vibrant green pine trees. Close-up on the van's tires shows the gravel spraying, highlighting the speed and rugged terrain. Sunlight filters through the trees, casting dappled shadows on the van and the trail. The background is a hazy, majestic mountain range bathed in warm, golden light. The overall mood is adventurous and exhilarating. High resolution 4k movie scene." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"aspect_ratio", "type":"select", "value":"1:1", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/standard/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Warm, incandescent streetlights paint the rain-slicked cobblestones in pools of amber light as a couple walks hand-in-hand, their silhouettes stark against the blurry backdrop of a city shrouded in a gentle downpour; the camera lingers on the subtle textures of their rain-soaked coats and the glistening reflections dancing on the wet pavement, creating a sense of intimate vulnerability and shared quietude." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/lion/_I_io6Gtk83c72d-afXf8_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/pro/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Warm, incandescent streetlights paint the rain-slicked cobblestones in pools of amber light as a couple walks hand-in-hand, their silhouettes stark against the blurry backdrop of a city shrouded in a gentle downpour; the camera lingers on the subtle textures of their rain-soaked coats and the glistening reflections dancing on the wet pavement, creating a sense of intimate vulnerability and shared quietude." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/lion/_I_io6Gtk83c72d-afXf8_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/kling-video/v2.1/master/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Sunlight dapples through budding branches, illuminating a vibrant tapestry of greens and browns as a pair of robins meticulously weave twigs and mud into a cradle of life, their tiny forms a whirlwind of activity against a backdrop of blossoming spring. The scene unfolds with a gentle, observational pace, allowing the viewer to fully appreciate the intricate details of nest construction, the soft textures of downy feathers contrasted against the rough bark of the branches, the delicate balance of strength and fragility in their creation." },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/zebra/9Nrm22YyLojSTPJbZYNhh_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/standard/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A Galactic Smuggler is a rogue figure with a cybernetic arm and a well-worn coat that hints at many dangerous escapades across the galaxy. Their ship is filled with rare and exotic treasures from distant planets, concealed in hidden compartments, showing their expertise in illicit trade. Their belt is adorned with energy-based weapons, ready to be drawn at any moment to protect themselves or escape from tight situations. This character thrives in the shadows of space, navigating between the law and chaos with stealth and wit, always seeking the next big score while evading bounty hunters and law enforcement. The rogue's ship, rugged yet efficient, serves as both a home and a tool for their dangerous lifestyle. The treasures they collect reflect the diverse and intriguing worlds they've encountered—alien artifacts, rare minerals, and artifacts of unknown origin. Their reputation precedes them, with whispers of their dealings and the deadly encounters that often follow. A master of negotiation and deception, the Galactic Smuggler navigates the cosmos with an eye on the horizon, always one step ahead of those who pursue them." } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/pro/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A Galactic Smuggler is a rogue figure with a cybernetic arm and a well-worn coat that hints at many dangerous escapades across the galaxy. Their ship is filled with rare and exotic treasures from distant planets, concealed in hidden compartments, showing their expertise in illicit trade. Their belt is adorned with energy-based weapons, ready to be drawn at any moment to protect themselves or escape from tight situations. This character thrives in the shadows of space, navigating between the law and chaos with stealth and wit, always seeking the next big score while evading bounty hunters and law enforcement. The rogue's ship, rugged yet efficient, serves as both a home and a tool for their dangerous lifestyle. The treasures they collect reflect the diverse and intriguing worlds they've encountered—alien artifacts, rare minerals, and artifacts of unknown origin. Their reputation precedes them, with whispers of their dealings and the deadly encounters that often follow. A master of negotiation and deception, the Galactic Smuggler navigates the cosmos with an eye on the horizon, always one step ahead of those who pursue them." } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02-fast/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Extremely realistic movement An old samurai is breaking a stone in half" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/tiger/U9HN_tm5-3Ls52SbD6CrW_image.webp" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/pro/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Man walked into winter cave with polar bear" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"resolution", "type":"select", "value":"768P", "options":[ { "label":"Resolution 512P", "value":"512P"} ,{ "label":"Resolution 768P", "value":"768P"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/model_tests/minimax/1749891352437225630-389852416840474630_1749891352.png" } ], "plat":"fal-ai" },{ "model":"fal-ai/minimax/hailuo-02/standard/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Man walked into winter cave with polar bear" },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 6s", "value":6} ,{ "label":"Duration 10s", "value": 10} ] },{ "key":"resolution", "type":"select", "value":"768P", "options":[ { "label":"Resolution 512P", "value":"512P"} ,{ "label":"Resolution 768P", "value":"768P"} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/model_tests/minimax/1749891352437225630-389852416840474630_1749891352.png" } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2.1/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A young woman in a pale blue corset and denim, her vibrant blue bob framed against a dusky desert landscape, walks slowly, her gaze unwavering and enigmatic as the camera remains fixed on her deliberate pace. The warm glow of a stucco house contrasts with the cool desert air, hinting at both refuge and isolation, while a blurred figure retreating inside adds a layer of unspoken narrative to her solitary journey." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2.2/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"Sunlight streams down on a woman with flowing auburn hair as she runs effortlessly along a tree-lined street, her joyous expression reflecting the freedom of the moment; the simple, steady camerawork emphasizes her grace and the beauty of the everyday." },{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] },{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2/turbo/text-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A young woman in a pale blue corset and denim, her vibrant blue bob framed against a dusky desert landscape, walks slowly, her gaze unwavering and enigmatic as the camera remains fixed on her deliberate pace. The warm glow of a stucco house contrasts with the cool desert air, hinting at both refuge and isolation, while a blurred figure retreating inside adds a layer of unspoken narrative to her solitary journey." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] },{ "key":"aspect_ratio", "type":"select", "value":"16:9", "options":[ { "label":"Ratio 16:9", "value":"16:9"} ,{ "label":"Ratio 9:16", "value":"9:16"} ,{ "label":"Ratio 1:1", "value":"1:1"} ,{ "label":"Ratio 4:5", "value":"4:5"} ,{ "label":"Ratio 5:4", "value":"5:4"} ,{ "label":"Ratio 3:2", "value":"3:2"} ,{ "label":"Ratio 2:3", "value":"2:3"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] } ], "plat":"fal-ai" } ,{ "model":"fal-ai/pika/v2.1/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A pink heart exploding." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/elephant/dJjBQXNHRbGJn4aUv4-g9_hearth.jpg" } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2.2/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"a woman looking into camera slowly smiling" } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://storage.googleapis.com/falserverless/web-examples/pika/pika%202.2/pika_input.png" } ], "plat":"fal-ai" },{ "model":"fal-ai/pika/v2/turbo/image-to-video", "field":[ { "key":"prompt", "type":"textarea", "placeholder":"Video Description", "value":"A pink heart exploding." } ,{ "key":"resolution", "type":"select", "value":"720p", "options":[ { "label":"Resolution 720p", "value":"720p"} ,{ "label":"Resolution 1080p", "value":"1080p"} ] } ,{ "key":"duration", "type":"select", "value":5, "options":[ { "label":"Duration 5s", "value":5} ,{ "label":"Duration 8s", "value": 8} ] },{ "key":"image_url", "type":"image_base64_url", "value":"https://v3.fal.media/files/elephant/dJjBQXNHRbGJn4aUv4-g9_hearth.jpg" } ], "plat":"fal-ai" } ] } ================================================ FILE: src/views/video/veo.ts ================================================ import { gptFetch, gptUploadFile, mlog } from "@/api" import { DtoItem, DtoStore } from "@/api/dtoStore" import { sleep } from "@/api/suno" import { homeStore } from "@/store" export interface DtoTpl{ model:string key?:string field:DtoField[] plat:string } export interface DtoField{ key:string type:string value?:any max?:number placeholder?:string options?: {labal:string,value:string}[] } const csuno= new DtoStore() export const PostVideo= async(nowModel:DtoTpl, data:any)=>{ mlog('PostVideo',nowModel); mlog('data ',data); let rz:DtoItem const plat= nowModel.plat if( plat=="google-veo" || plat=="sora" ){ rz= await googleVeo(nowModel,data) }else if(plat=='openai'){ rz= await openaiVideo(nowModel,data) }else if(plat=='fal-ai'){ rz= await falAI(nowModel,data) }else{ mlog("plat",plat, "这个平台没有指定") return } rz.model= nowModel.model csuno.save( rz) homeStore.setMyData({act:'dtoFeed'}); DtoFeed(rz) } export const DtoFeed= async (item:DtoItem)=>{ // mlog("sdsds",item ) // if(item.plat=="google-veo"){ // googleVeoFeed(item.id) // }else if(item.plat=="fal-ai"){ // falAiFeed(item.id) // } if(item.plat=="fal-ai"){ falAiFeed(item.id) }else if(item.plat=="openai" ){ openaiVideoFeed(item.id) }else{ googleVeoFeed(item.id) } } const falAI= async(nowModel:DtoTpl, data:any)=>{ const d:any = await gptFetch( '/'+nowModel.model ,data) const id= d.request_id let rz:DtoItem={ mid: id, id, type: "video", plat: nowModel.plat, status: "submitted", last_feed: Math.floor(Date.now() / 1000), title:data.prompt??'no prompt' } return rz } const openaiVideo= async(nowModel:DtoTpl, data:any)=>{ data['model']= nowModel.key?? nowModel.model //var d:any //d = await gptFetch('/v1/videos',data) const formData = new FormData( ); for(let o in data ){ if(o=='input_reference'&& data[o]?.file ){ // for(let f of data.data.base64Array){ // formData.append('image[]', f.file ) // } formData.append('input_reference', data[o]?.file ) }else{ formData.append(o, data[o]) } } //mlog("formData ", formData ) //const jda= upd.data //try { const ds = await gptUploadFile('/v1/videos', formData) const d=ds.data; if(ds.status!=200) throw "Fail with status:"+ ds.status mlog("rz ", d ) // }catch(e){ // mlog("error ", e ) // } let rz:DtoItem={ mid: d.id, id: d.id, type: "video", plat: nowModel.plat, status: "submitted", last_feed: Math.floor(Date.now() / 1000), title:data.prompt??'no prompt' } return rz } const googleVeo= async(nowModel:DtoTpl, data:any)=>{ data['model']= nowModel.model const plat= nowModel.plat var d:any if (plat=="google-veo"){ d = await gptFetch('/veo/v1/video/create',data) }else{ d = await gptFetch('/'+plat+'/v1/video/create',data) } // mlog('返回数据 ',d ); let rz:DtoItem={ mid: d.id, id: d.id, type: "video", plat: nowModel.plat, status: "submitted", last_feed: Math.floor(Date.now() / 1000), title:data.prompt??'no prompt' } return rz } export const falAiFeed= async( id:string)=>{ for(let i=0;i<60;i++){ let rz= csuno.getOneById(id) if(!rz){ return } if(rz?.status=='completed'|| rz?.status=='failed'){ return } if(!rz.model){ rz.model='fal-ai/ltxv-13b-098-distilled/image-to-video' } const arr= rz.model.split('/') const url= '/'+arr[0]+'/'+arr[1]+'/requests/'+ rz.mid; //requests/b551cfac-0399-4122-a3fa-91e8760f5086 try { const d:any = await gptFetch(url) rz.url= d.video?.url??'' rz.data=d rz.status= rz.url?'completed':'pending' } catch (error) { rz.status= 'pending' } rz.last_feed=Math.floor(Date.now() / 1000) console.log('ddd',d, rz ); csuno.save(rz) homeStore.setMyData({act:'dtoFeed'}); await sleep(3000) } } export const openaiVideoFeed=async( id:string)=>{ for(let i=0;i<60;i++){ let rz= csuno.getOneById(id) if(!rz){ return } if(rz?.status=='completed'|| rz?.status=='failed'){ return } const url= '/v1/videos/'+ rz.mid; try { const d:any = await gptFetch(url) if(d.status=='failed'){ rz.status='failed' rz.data=d }else{ var obj:string=d.url??(d.video_url??'') rz.url= obj.startsWith('http')?obj:'' rz.data=d rz.status= rz.url?'completed': d.status if(d.progress && d.progress>0){ rz.status=d.progress+ '%' } } } catch (error) { rz.status= 'pending' } rz.last_feed=Math.floor(Date.now() / 1000) console.log('ddd', rz ); csuno.save(rz) homeStore.setMyData({act:'dtoFeed'}); await sleep(5000) } } export const googleVeoFeed= async( id:string)=>{ for(let i=0;i<60;i++){ let rz= csuno.getOneById(id) if(rz?.status=='completed'|| rz?.status=='failed'){ break } var d:any if (rz && rz.plat!='google-veo' && rz.plat!=''){ d = await gptFetch(`/${rz.plat}/v1/video/feed/${id}`) }else{ d = await gptFetch(`/veo/v1/video/feed/${id}`) } if(!rz){ rz={ mid: d.id, id: d.id, type: "video", plat: 'google-veo', status: "submitted", last_feed: 0, title:'no prompt' } } rz.last_feed=Math.floor(Date.now() / 1000) rz.status= d.status?? rz.status rz.url= d.video_url??'' rz.data=d csuno.save(rz) homeStore.setMyData({act:'dtoFeed'}); await sleep(3000) } } export const breakpoints= { 2000: { //当屏幕宽度小于等于1200 rowPerView: 6, }, 1600: { //当屏幕宽度小于等于1200 rowPerView: 5, }, 1200: { //当屏幕宽度小于等于1200 rowPerView: 4, }, 800: { //当屏幕宽度小于等于800 rowPerView: 3, }, 500: { //当屏幕宽度小于等于500 rowPerView: 2, } } ================================================ FILE: src/views/viggle/dance.vue ================================================ ================================================ FILE: src/views/viggle/dcInput.vue ================================================ ================================================ FILE: src/views/viggle/dcList.vue ================================================ ================================================ FILE: src/views/viggle/dcTemple.vue ================================================ ================================================ FILE: src/views/wav/an_main.vue ================================================ ================================================ FILE: src/views/wav/css/in-and-out.css ================================================ /** * in-and-out * * @author in-and-out */ @-webkit-keyframes in-and-out { 0%, 30% { -webkit-transform: rotate(calc(var(--offset) * -1deg)); transform: rotate(calc(var(--offset) * -1deg)); } 70%, 100% { -webkit-transform: rotate(calc(var(--offset) * 1deg)); transform: rotate(calc(var(--offset) * 1deg)); } } @keyframes in-and-out { 0%, 30% { -webkit-transform: rotate(calc(var(--offset) * -1deg)); transform: rotate(calc(var(--offset) * -1deg)); } 70%, 100% { -webkit-transform: rotate(calc(var(--offset) * 1deg)); transform: rotate(calc(var(--offset) * 1deg)); } } @-webkit-keyframes in-and-out-two { 0%, 30% { -webkit-transform: rotate(calc(var(--offset) * 1deg)); transform: rotate(calc(var(--offset) * 1deg)); } 70%, 100% { -webkit-transform: rotate(calc(var(--offset) * -1deg)); transform: rotate(calc(var(--offset) * -1deg)); } } @keyframes in-and-out-two { 0%, 30% { -webkit-transform: rotate(calc(var(--offset) * 1deg)); transform: rotate(calc(var(--offset) * 1deg)); } 70%, 100% { -webkit-transform: rotate(calc(var(--offset) * -1deg)); transform: rotate(calc(var(--offset) * -1deg)); } } @-webkit-keyframes in-and-out-children { 0%, 50% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); } 80%, 100% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); } } @keyframes in-and-out-children { 0%, 50% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); } 80%, 100% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); } } @-webkit-keyframes in-and-out-two-children { 0%, 50% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); } 80%, 100% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); } } @keyframes in-and-out-two-children { 0%, 50% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 40px); } 80%, 100% { -webkit-transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); transform: rotate(calc(var(--rotation) * 1deg)) translate(0, 15px); } } .in-and-out { --offset: 18; } .in-and-out > div { --radius: 30; --size: 10; height: calc(var(--size) * 1px); width: calc(var(--size) * 1px); position: absolute; } .in-and-out > div:nth-of-type(1) { --multiplier: 1; -webkit-animation: in-and-out 1s infinite ease both; animation: in-and-out 1s infinite ease both; } .in-and-out > div:nth-of-type(1) div { -webkit-animation: in-and-out-children 1s infinite ease; animation: in-and-out-children 1s infinite ease; } .in-and-out > div:nth-of-type(2) { --multiplier: 2; -webkit-animation: in-and-out-two 1s infinite ease both; animation: in-and-out-two 1s infinite ease both; } .in-and-out > div:nth-of-type(2) div { -webkit-animation: in-and-out-two-children 1s infinite ease; animation: in-and-out-two-children 1s infinite ease; } .in-and-out div div { background: var(--primary); border-radius: 100%; height: 100%; position: absolute; width: 100%; } .in-and-out div div:nth-child(1) { --rotation: 72; } .in-and-out div div:nth-child(2) { --rotation: 144; } .in-and-out div div:nth-child(3) { --rotation: 216; } .in-and-out div div:nth-child(4) { --rotation: 288; } .in-and-out div div:nth-child(5) { --rotation: 360; } ================================================ FILE: src/views/wav/realtime.vue ================================================ ================================================ FILE: src/views/wav/realtimeLayout.vue ================================================ ================================================ FILE: src/views/wav/wav.vue ================================================ ================================================ FILE: src/views/wav/wavSetting.vue ================================================ ================================================ FILE: src-tauri/.gitignore ================================================ # Generated by Cargo # will have compiled files and executables /target/ ================================================ FILE: src-tauri/Cargo.toml ================================================ [package] name = "app" version = "0.1.0" description = "A Tauri App" authors = ["you"] license = "" repository = "" default-run = "app" edition = "2021" rust-version = "1.60" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] tauri-build = { version = "1.5.1", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.6.1", features = [ "updater", "window-minimize", "window-show", "shell-open", "window-close", "fs-all", "window-start-dragging", "window-maximize", "window-set-resizable", "notification-all", "window-unminimize", "clipboard-all", "window-hide", "dialog-all", "window-set-ignore-cursor-events", "window-unmaximize", "window-set-icon"] } [features] # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. # If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. # DO NOT REMOVE!! custom-protocol = [ "tauri/custom-protocol" ] ================================================ FILE: src-tauri/build.rs ================================================ fn main() { tauri_build::build() } ================================================ FILE: src-tauri/src/main.rs ================================================ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { tauri::Builder::default() .run(tauri::generate_context!()) .expect("error while running tauri application"); } ================================================ FILE: src-tauri/tauri.conf.json ================================================ { "$schema": "../node_modules/@tauri-apps/cli/schema.json", "build": { "beforeBuildCommand": "yarn build", "beforeDevCommand": "yarn dev", "devPath": "http://localhost:1002", "distDir": "../dist" }, "package": { "productName": "ChatGPT-MJ", "version": "2.26.1" }, "tauri": { "allowlist": { "all": false, "shell": { "all": false, "open": true }, "dialog": { "all": true, "ask": true, "confirm": true, "message": true, "open": true, "save": true }, "clipboard": { "all": true, "writeText": true, "readText": true }, "window": { "all": false, "close": true, "hide": true, "maximize": true, "minimize": true, "setIcon": true, "setIgnoreCursorEvents": true, "setResizable": true, "show": true, "startDragging": true, "unmaximize": true, "unminimize": true }, "fs": { "all": true }, "notification": { "all": true } }, "bundle": { "active": true, "category": "DeveloperTool", "copyright": "2024, Dooy All Rights Reserved.", "deb": { "depends": [] }, "externalBin": [], "icon": [ "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" ], "identifier": "com.github.Dooy.chatgpt-web-midjourney-proxy", "longDescription": "GPT&Midjourney( GPT-MJ) is a cross-platform ChatGPT and Midjourney client, including Web/Win/Linux/OSX/PWA.", "macOS": { "entitlements": null, "exceptionDomain": "", "frameworks": [], "providerShortName": null, "signingIdentity": null }, "resources": [], "shortDescription": "ChatGPT and Midjourney App", "targets": "all", "windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", "timestampUrl": "" } }, "security": { "csp": null }, "updater": { "active": true, "endpoints": [ "https://github.com/Dooy/chatgpt-web-midjourney-proxy/releases/latest/download/latest.json" ], "dialog": false, "windows": { "installMode": "passive" }, "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDk4RjFEMDQ2ODE1ODVDMjQKUldRa1hGaUJSdER4bUdNQ2wyZjJIcE1IbDJWajRJVVZwQXA1c3BqL0gzaUZhc0pUeXg2ak5ZRjAK" }, "windows": [ { "fullscreen": false, "height": 640, "resizable": true, "title": "ChatGPT and Midjourney", "width": 960, "hiddenTitle": true, "titleBarStyle": "Overlay" } ] } } ================================================ FILE: start.cmd ================================================ cd ./service start pnpm start > service.log & echo "Start service complete!" cd .. echo "" > front.log start pnpm dev > front.log & echo "Start front complete!" ================================================ FILE: start.sh ================================================ cd ./service nohup pnpm start > service.log & echo "Start service complete!" cd .. echo "" > front.log nohup pnpm dev > front.log & echo "Start front complete!" tail -f front.log ================================================ FILE: tailwind.config.js ================================================ /** @type {import('tailwindcss').Config} */ module.exports = { darkMode: 'class', content: [ './index.html', './src/**/*.{vue,js,ts,jsx,tsx}', ], theme: { extend: { animation: { blink: 'blink 1.2s infinite steps(1, start)', }, keyframes: { blink: { '0%, 100%': { 'background-color': 'currentColor' }, '50%': { 'background-color': 'transparent' }, }, }, }, }, plugins: [], } ================================================ FILE: tauri_debug.sh ================================================ pnpm tauri dev ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "baseUrl": ".", "module": "ESNext", "target": "ESNext", "lib": ["DOM", "ESNext"], "strict": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "jsx": "preserve", "moduleResolution": "node", "resolveJsonModule": true, "noUnusedLocals": true, "strictNullChecks": true, "forceConsistentCasingInFileNames": true, "skipLibCheck": true, "paths": { "@/*": ["./src/*"] }, "types": ["vite/client", "node", "naive-ui/volar"] }, "exclude": ["node_modules", "dist", "service"] } ================================================ FILE: vercel.json ================================================ { "rewrites": [ { "source": "/openapi/(.*)", "destination": "/api/proxy" }, { "source": "/mjapi/(.*)", "destination": "/api/proxy" } ] } ================================================ FILE: vite.config.ts ================================================ import path from 'path' import type { PluginOption } from 'vite' import { defineConfig, loadEnv } from 'vite' import vue from '@vitejs/plugin-vue' import { VitePWA } from 'vite-plugin-pwa' import { viteStaticCopy } from 'vite-plugin-static-copy' function setupPlugins(env: ImportMetaEnv): PluginOption[] { return [ vue(), viteStaticCopy({ targets: [ { src: path.resolve(__dirname, './src/static/mitf') + '/[!.]*', // 1️⃣ dest: './mitf/', // 2️⃣ }, ], }), VitePWA({ // env.VITE_GLOB_APP_PWA === 'true' && injectRegister: 'auto', manifest: { name: 'chatGPT-MJ', short_name: 'chatGPT-MJ', icons: [ { src: 'pwa-192x192.png', sizes: '192x192', type: 'image/png' }, { src: 'pwa-512x512.png', sizes: '512x512', type: 'image/png' }, ], }, }), ] } export default defineConfig((env) => { const viteEnv = loadEnv(env.mode, process.cwd()) as unknown as ImportMetaEnv return { resolve: { alias: { '@': path.resolve(process.cwd(), 'src'), }, }, plugins: setupPlugins(viteEnv), server: { host: '0.0.0.0', port: 1002, open: false, proxy: { '/api': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 rewrite: path => path.replace('/api/', '/'), }, '/mjapi': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, '/sunoapi': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 }, '/uploads': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, '/openapi': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, '/luma': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, // '/viggle': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, '/runwayml': { target: viteEnv.VITE_APP_API_BASE_URL, changeOrigin: true, // 允许跨域 //rewrite: path => path.replace('/api/', '/'), }, }, }, build: { reportCompressedSize: false, sourcemap: false, commonjsOptions: { ignoreTryCatch: false, }, }, } })